- GET 방식
GET은 서버로부터 정보를 조회하기 위해 설계된 메소드로 주로 데이터를 읽거나(Read), 검색(Retrieve)할 때에 사용된다.
GET은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리스트링을 통해 전송한다. 쿼리스트링이란 URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터로 요청 파라미터가 여러 개이면 &로 연결한다.
예) www.example-url.com/resources?name1=value1&name2=value2
여기서 요청 파라미터명은 name1, name2이고, 각각의 파라미터는 value1, value2라는 값으로 서버에 요청을 보내게 된다.
- POST 방식
POST는 리소스를 생성/변경하기 위해 설계되었기 때문에 GET과 달리 전송해야될 데이터를 HTTP 메세지의 Body에 담아서 전송한다. HTTP 메세지의 Body는 길이의 제한없이 데이터를 전송할 수 있으므로 POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있다. 이처럼 POST는 데이터가 Body로 전송되고 내용이 눈에 보이지 않아 GET보다 보안적인 면에서 안전하다고 생각할 수 있지만, POST 요청도 크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있기 때문에 민감한 데이터의 경우에는 반드시 암호화해 전송해야 한다.
그리고 POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야 된다. 데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장자명 등으로 데이터 타입을 유추한다. 만약, 알 수 없는 경우에는 application/octet-stream로 요청을 처리한다.
참고) POST는 생성, 수정, 삭제에 사용할 수 있지만, 생성에는 POST, 수정은 PUT 또는 PATCH, 삭제는 DELETE가 더 용도에 맞는 메소드이다.
<!DOCTYPE html>
<html>
<head>
<title>상세 페이지</title>
<script>
</script>
</head>
<body>
<div class="container" id="card-box">
<h1>제목 : {{ movie['title'] }}</h1>
<img src="{{ movie['image'] }}" alt="image" style="max-width: 200px; height: auto;">
<p>내용 : {{ movie['desc'] }}</p>
<p>평점 :
{% for i in range(movie['star']|int) %}
⭐
{% endfor %}
</p>
<p>리뷰 : {{ movie['comment'] }}</p>
</div>
<a href="/update/{{ find_id['_id'] }}">수정</a>
<button onclick="location.href='/'">목록</button>
<form action="/delete/{{ find_id['_id'] }}" method="POST"><input type="submit" value="삭제"></form>
</body>
</html>
from flask import Flask, render_template, request, jsonify, redirect
app = Flask(__name__)
from bson.objectid import ObjectId
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.awfowzp.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
import requests
from bs4 import BeautifulSoup
@app.route('/')
def home():
return render_template('index.html')
@app.route("/movies/new", methods=["GET"])
def get_write():
return render_template('write.html')
@app.route("/movies/new", methods=["POST"])
def post_write():
url_receive = request.form['url_give']
comment_receive = request.form['comment_give']
star_receive = request.form['star_give']
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get(url_receive,headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
ogtitle = soup.select_one('meta[property="og:title"]')['content']
ogimage = soup.select_one('meta[property="og:image"]')['content']
ogdesc = soup.select_one('meta[property="og:description"]')['content']
doc = {
'title' : ogtitle,
'desc' : ogdesc,
'image' : ogimage,
'url' : url_receive,
'comment' : comment_receive,
'star' : star_receive,
}
db.movies.insert_one(doc)
return redirect('/')
@app.route("/movie", methods=["GET"])
def movie_get():
all_movies = list(db.movies.find({},{'_id':True, 'title':True, 'desc':True, 'image':True, 'star':True, 'comment':True}))
# ObjectId 값을 String 형식으로 변환
for movie in all_movies:
movie['_id'] = str(movie['_id'])
return jsonify({'result':all_movies})
@app.route("/view/<id>", methods=["GET"])
def one_find_movie(id):
find_movie = db.movies.find_one({"_id": ObjectId(id)})
find_movie['_id'] = str(find_movie['_id'])
find_id = db.movies.find_one({'_id' : ObjectId(id)},{'id':True})
return render_template('view.html', movie=find_movie, find_id=find_id)
@app.route("/update/<id>", methods=["GET"])
def update_get(id):
find_movie = db.movies.find_one({"_id": ObjectId(id)})
find_movie['_id'] = str(find_movie['_id'])
find_id = db.movies.find_one({'_id' : ObjectId(id)},{'id':True})
return render_template('update.html', movie=find_movie, find_id=find_id)
@app.route("/update/<id>", methods=["POST"])
def update_post(id):
comment_receive = request.form['comment_give']
star_receive = request.form['star_give']
find_movie = db.movies.find_one({"_id": ObjectId(id)})
find_movie['_id'] = str(find_movie['_id'])
db.movies.update_one({'_id': ObjectId(id)},{'$set':{'comment':comment_receive}})
db.movies.update_one({'_id': ObjectId(id)},{'$set':{'star':star_receive}})
return redirect('/view/' + str(id))
# 삭제
@app.route("/delete/<id>", methods=["POST"])
def delete_post(id):
find_movie = db.movies.find_one({"_id": ObjectId(id)})
find_movie['_id'] = str(find_movie['_id'])
db.movies.delete_one({'_id': ObjectId(id)})
return redirect('/')
if __name__ == '__main__':
app.run('0.0.0.0', port=5001, debug=True)
삭제는 GET이 아닌 POST 방식으로 처리한다.