自由形種目再包装[aimmo]


PreonBoddingの最初の企業難題aimmoプロジェクトを再包装しましたこれは、当時要求された機能の実装を完了していないため、チームメンバーと一緒に簡単に導入を完了したことを残念に思っています.
リビルド方向
まず、最も重要なのは、企業に必要なすべての機能を実現することです.当時.
  • コメントコメントコメント機能
  • 検索機能(完全に実装、コミットされていない)
  • query最適化
  • コメント、検索大コメントリスト
  • 作成
  • テストコード
  • そこで,今回の再構成の目標は上記の機能を達成することである.
    梱包し直して知った事
    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を例にとると、グーグル化すると、最初から多くの内容や概念が整理された文章があり、書くには時間がかかるかもしれません.
    ローカル環境
    作成
  • 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を参照