Image_Us-스웨거 모델 클래스

codakcodak·2023년 2월 27일
0

ImageUs

목록 보기
7/17

문제상황

  • 스웨거를 적용할 때
from flask_restx import reqparse,fields

id=fields.Integer(
                default=1,
                description="int_id",
                required=False
            )
 api_model=api.model('id_model',{'id':id})
  
 parser=reqparse.RequestParser()
 parser.add_argument('Authorization',type=str,
                        location='headers',
                        help='access_token',
                        required=False)
 
 @user_namespace.route("/search")
 class user_search(Resource):
        @user_namespace.expect(api_model,parser,validate=False)
        @user_namespace.response(200,'검색한 유저의 정보를 반환
  
	  

위처럼 parser과 model을 명시하려면 route마다 새로운 클래스를 저장하고 선언해야 하는데 보통은 route가 수십개 이기 때문에 위처럼 구현한다면 route가 선언된 파일이 지저분해지고 가독성도 떨어진다.

1.parser 클래스 생성

from flask_restx import reqparse,fields
class ParserModule:
    def get_parser(self,args):
        parser=reqparse.RequestParser()
        if 'Authorization' in args:
            parser.add_argument('Authorization',type=str,
                        location='headers',
                        help='access_token',
                        required=False)
        if 'email' in args:
            parser.add_argument('email',type=str,
                                location='args',
                                help='email_str',
                                required=False)

*if에 여러 키워드 들을 설정하여 클래스 생성시 원하는 키워드 들을 모두 명시하면 알아서 parser을 모두 추가

2.swagger 모델 클래스 생성

from flask_restx import reqparse,fields
class ApiModel:
    id=fields.Integer(
                default=1,
                description="int_id",
                required=False
            )
    name=fields.String(
                default="testname",
                description="str_user_name",
                required=False
            )
    def __init__(self,api):
        self.api=api
        
    def get_model(self,modelname,args):
        payload={}
        if 'id' in args:
            payload['id']=self.id
        
        if 'name' in args:
            payload['name']=self.name
            
        api_model=self.api.model(modelname,payload)
        
        return api_model

*모든 클래스에서 공통적으로 쓸 여러 인자들이 포함된 클래스 변수 명시

*전달받은 api를 인스턴스 변수로 저장

*get_model은 원하는 성분을 모두 담아 model로 생성할 수 있는 메서드

3.route 파일에서 인스턴스 클래스 생성 및 사용

def user_router(api,services,config,es):
    user_service=services.user_service
    image_service=services.image_service
    room_service=services.room_service

    api.add_namespace(user_namespace,'')
    
    api_error=ApiError(user_namespace)
    
    api_model=ApiModel(user_namespace)
    api_parser_module=ParserModule()
    
    post_user_email_auth_model=api_model.get_model("post_user_email_auth_model",['id','name'])
    post_user_email_auth_parser=api_parser_module.get_parser(['Authorizaton','email'])

	@user_namespace.expect(post_user_email_auth_parser,post_user_email_auth_model,validate=False)
@user_namespace.response(200,"email:test@test.com has auth success")

*api_model와 api_parser_module에 처음에 정의했던 인스턴스 클래스 저장

*api_parser_module.get_parser메서드에 생성하고 싶은 parser의 키워드들을 배열로 모두 선언

*api_model.get_model메서드에 생성하고 싶은 model의 키워드들을 배열로 모두 선언

결과

  • 원하는 키워드들을 모두 담아 생성하는 args인자를 배열로 선언함으로서 여러줄에서 한줄로 처리가능

  • route가 담긴 파일이 전체적으로 가독성 상승

profile
숲을 보는 코더

0개의 댓글