自由形種目再包装[aimmo]
PreonBoddingの最初の企業難題aimmoプロジェクトを再包装しましたこれは、当時要求された機能の実装を完了していないため、チームメンバーと一緒に簡単に導入を完了したことを残念に思っています.
リビルド方向
まず、最も重要なのは、企業に必要なすべての機能を実現することです.当時.コメントコメントコメント機能 検索機能(完全に実装、コミットされていない) query最適化 コメント、検索大コメントリスト 作成テストコード そこで,今回の再構成の目標は上記の機能を達成することである.
梱包し直して知った事
Swagger + drf-yasg
custom query parameter
最初のプロジェクトであるため、
エラーメッセージの管理
クエリーの最適化
知っておくべき
配備時にノイズが必要
前回の導入で発生した問題から始め、解決します.まだ完全に理解されていませんが、配置時に静的ファイルを手動で管理する必要があります.開発時、DEBUG=TRUEの場合、Djangoは静的ファイルを自動的に管理しますが、配備されている場合は個別に管理する必要がある場合があります.この点はまだ理解しなければならない.ソリューションはdjango whitenoiseをインストールすることで導入されます.
再包装と導入の方法をdockerで置き換えました.以前のプロジェクトもdockerとして導入されたことがあるので、基本的な文法はおなじみですが、久しぶりに使ったので、順番を整理したいだけです.実は配置と言えばイメージだけを作るのですが….サーバーしか運転したことがないと思います.dockerを例にとると、グーグル化すると、最初から多くの内容や概念が整理された文章があり、書くには時間がかかるかもしれません.
ローカル環境
作成 Dockerfile Dockerイメージバージョン ドックイメージプッシュ(ドックセンターで検出可能) EC 2環境
全 EC 2環境では、奮闘中にドック を設置するドッキングイメージ検証コンテナはまだ を実行していません. ducker画像キャプチャrun 今回はこのような手順で行いましたもっと勉強しなければなりません!
Mongo DBのトラブルシューティング
MongoError:user not not ando action[find]:ギターを弾く開発者の販売ガイドブログを参照してください.
それ以外は... Django ORMでの使い方 try-除文は少し重い場合があります.if論理処理 を使用してください.
明かり.気をつけなきゃいけないことがたくさんあると改めて感じました
整理する
うん.書いてみると、プロジェクト再構築というより、実現していない機能が実装されていると思います.
Reference
https://phpdoumi.tistory.com/204[ITで何をしますか?]:ホワイトノイズを参照
https://wangkisa.tistory.com/48[Wangkisaのテクニカルブログ]:whitenoiseを参照
リビルド方向
まず、最も重要なのは、企業に必要なすべての機能を実現することです.当時.
梱包し直して知った事
Swagger + drf-yasg
custom query parameter
最初のプロジェクトであるため、
swagger + drf+yasg
の使用はまだ未熟である.この内容をブログでまとめてみましたaimmoプロジェクトでは、学習swagger + drf+yasg
の部分は、カスタマイズ管理query parameter
の部分である.query_parent_comment_id = openapi.Parameter(
"parent_comment_id",
openapi.IN_QUERY,
description = "parent_comment_id",
type = openapi.TYPE_INTEGER
)
query_limit = openapi.Parameter(
"limit",
openapi.IN_QUERY,
description = "limit",
type = openapi.TYPE_INTEGER
)
query_offset = openapi.Parameter(
"offset",
openapi.IN_QUERY,
description = "offset",
type = openapi.TYPE_INTEGER
)
@swagger_auto_schema(manual_parameters = [query_parent_comment_id, query_limit, query_offset])
上記のコードに対応して、manual_parameters
というパラメータによって実現される.リストには、API通信を実現するために必要なquery parameter
がリストされている.これも残念な点で、djangoが提供するPaginatorライブラリを使用するつもりでしたが、それはできず、手動でページングを実現しました.前回書いたブログでは、openapi.IN_QUERY
というセクションで、query
に送信するか、header
に送信するかのオプションを設定することができます.エラーメッセージの管理
parameter_token = openapi.Parameter(
"Authorization",
openapi.IN_HEADER,
description = "access_token",
type = openapi.TYPE_STRING
)
query_comment_id = openapi.Parameter(
"comment_id",
openapi.IN_QUERY,
description = "댓글 ID를 넣어주세요",
type = openapi.TYPE_INTEGER
)
error_field = openapi.Schema(
'error', # 제목
description = '입력 부분을 수정해주세요', # 설명
type=openapi.TYPE_STRING # 타입
)
@swagger_auto_schema(request_body = CommentSerializer,
manual_parameters = [parameter_token, query_comment_id],
responses = {
400 : error_field # responses
}
)
このコードはまだ完成していません.しかし、記録したいので書きます.傲慢さは非常に強力なドキュメント化ツールですが、残念なこともたくさんあります.(前回ブログに関連内容がありました)最も不便な点はresponse schema
が提供されていないことです.私たちはdrf-yasg
を使ってこの問題を解決すると思います.未完了の部分は上記のコードのerror_field
であり、drf-yasgを使用すると、このようなerrortype管理ドキュメントを提供することができる.クエリーの最適化
def get(self, request, posting_id):
parent_comment_id = request.GET.get("parent_comment_id",0)
offset = int(request.GET.get("offset", 0))
limit = int(request.GET.get("limit", 10))
if parent_comment_id == 0:
all_comments = Comment.objects.filter(posting_id=posting_id, parent_comment_id=0).select_related("user")
else:
all_comments = Comment.objects.filter(posting_id=posting_id, parent_comment_id=parent_comment_id).select_related("user")
comments = all_comments[offset:offset+limit]
comment_list = [
{
"content" : comment.content,
"user" : comment.user.email,
"posting_title" : comment.posting.title,
"parent_comment_id" : comment.parent_comment_id
} for comment in comments
]
return JsonResponse({"message" : comment_list}, status=200)
これは非常に簡単なコードですが、django-extentions
を使用してORMがSQL文に変換された後に変更されたコードを検証します.変更された部分はselect_related
であり、他のフィールドから取得された値が含まれている場合、select_related method
を使用してプリキャッシュすることができ、ORMがデータベースにアクセスする回数を著しく減少させることができる.select_related method
がない場合、select_related method
のコードを使用して要求は1回のみであり、毎回ユーザーフィールドに個別にアクセスする場合、要求は1回のみである.postings = Posting.objects.filter(Q(author__name=keyword)|\
Q(title__icontains=keyword)|\
Q(text__icontains=keyword))\
.select_related("category", "author")
この部分はメンバーが書いたコードでこの部分でも使われていますicontains
もわかりましたselect_related
のパラメータは、フィールド名を使用してコンピュータで区切られ、複数の形式で入力できます.知っておくべき
配備時にノイズが必要
前回の導入で発生した問題から始め、解決します.まだ完全に理解されていませんが、配置時に静的ファイルを手動で管理する必要があります.開発時、DEBUG=TRUEの場合、Djangoは静的ファイルを自動的に管理しますが、配備されている場合は個別に管理する必要がある場合があります.この点はまだ理解しなければならない.ソリューションはdjango whitenoiseをインストールすることで導入されます.
pip install whitenoise
settings.py
STATIC_URL = '/staticfiles/'
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
今回のプロジェクトはこのように解決され、ミドルウェアに追加する方法があるようです.settings.py 파일에서
미들웨어 부분 :
'whitenoise.middleware.WhiteNoiseMiddleware',
static_root 부분 :
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
配備docker再包装と導入の方法をdockerで置き換えました.以前のプロジェクトもdockerとして導入されたことがあるので、基本的な文法はおなじみですが、久しぶりに使ったので、順番を整理したいだけです.実は配置と言えばイメージだけを作るのですが….サーバーしか運転したことがないと思います.dockerを例にとると、グーグル化すると、最初から多くの内容や概念が整理された文章があり、書くには時間がかかるかもしれません.
ローカル環境
作成
全
Mongo DBのトラブルシューティング
MongoError:user not not ando action[find]:ギターを弾く開発者の販売ガイドブログを参照してください.
それ以外は...
明かり.気をつけなきゃいけないことがたくさんあると改めて感じました
整理する
うん.書いてみると、プロジェクト再構築というより、実現していない機能が実装されていると思います.
Reference
https://phpdoumi.tistory.com/204[ITで何をしますか?]:ホワイトノイズを参照
https://wangkisa.tistory.com/48[Wangkisaのテクニカルブログ]:whitenoiseを参照
Reference
この問題について(自由形種目再包装[aimmo]), 我々は、より多くの情報をここで見つけました https://velog.io/@dhhyy/프리-온보딩-프로젝트-리팩토링-aimmoテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol