IL(#4) - 03.04



スモールプロジェクト期間の最終日には、APIの実装が終了してから約21時間エンコードされ、AWSサーバの導入とプロジェクトの説明を準備した.
スモールプロジェクトリンク
ログインおよびコスト入金の実装プロセス(JWT)
JWTとは?
クライアントのセッションステータスを格納するのではなく、サーバとクライアントの間で必要な情報を伝達するトークンベースの認証方法.
長所は?
WTは既存のセッションに情報を格納し、Cookieをセッションで交換し、JMTはユーザの情報をトークンに入れてユーザに送信し、サーバの拡張とメンテナンスに有利である.
タグ生成コードの例
 # 로그인
   username_receive = request.form['username_give']
   password_receive = request.form['password_give']
   pw_hash = hashlib.sha256(password_receive.encode('utf-8')).hexdigest()
   result = db.users.find_one({'username': username_receive, 'password': pw_hash})

   if result is not None:
      payload = {
      'id': username_receive,
      'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 24)  # 로그인 24시간 유지
      }
      token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')

      return jsonify({'result': 'success', 'token': token})
   # 찾지 못하면
   else:
      return jsonify({'result': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})
ログイン時にトークンのCookieを使用して情報を交換します.
#저장 API
@app.route('/api/save', methods = ['POST'])
def save_trip():
      token_receive = request.cookies.get('mytoken')
      try:
         payload = jwt.decode(token_receive, SECRET_KEY, algorithms = ['HS256'])
         myRegion_info = request.form['region_give'];
         myPlaceName_info = request.form['placeName_give'];
         myPlaceAddress_info = request.form['placeAddress_give'];
         myPlaceUrl_info = request.form['placeUrl_give'];
         myPlaceImg_info = request.form['placeImg_give'];
         myAccommodationName_info = request.form['accommodationName_give'];
         myAccommodationAddress_info = request.form['accommodationAddress_give'];
         myAccommodationUrl_info = request.form['accommodationUrl_give'];
         username = payload['id']
         doc = {
         'username': username,
         'region': myRegion_info,
         'place_name': myPlaceName_info,
         'place_address': myPlaceAddress_info,
         'place_url': myPlaceUrl_info,
         'place_img': myPlaceImg_info,
         'accommodation_name': myAccommodationName_info,
         'accommodation_address': myAccommodationAddress_info,
         'accommodation_url': myAccommodationUrl_info,
         }
         print(doc)
         db.myTrip.insert_one(doc)
         return jsonify({'msg': '저장완료!'})
      except(jwt.ExpiredSignatureError, jwt.exceptions.DecodeError):
         return redirect(url_for('home'))
サーバ側レンダリング
サーバ側レンダリングは、JavaScriptヘルプなしで直接サーバ上でviewを生成するため、クライアントの初期ロード速度が速い.
また、検索エンジンの最適化(SEO,Search Engine Optimization)に有利であり、このサイトを検索エンジンによく表示させる.
文字列MongoDB Object ID
モンゴディー比に格納されているObject IDを文字列化する必要があります.DBからJavaScriptに降格した場合、String形式ではなくロードできません.
def mypage_listing():
   token_receive = request.cookies.get('mytoken')
   try:
      payload = jwt.decode(token_receive, SECRET_KEY, algorithms = ['HS256'])
      user_info = list(db.myTrip.find({'username': payload['id']}))
      for data in user_info:
         data['_id'] = str(data['_id'])
      return jsonify({'mypage_data': user_info})
   except (jwt.ExpiredSignatureError, jwt.exceptions.DecodeError):
      return redirect(url_for('home'))