【问题标题】:Python decorator to check for POST parameters on DjangoPython 装饰器检查 Django 上的 POST 参数
【发布时间】:2014-07-19 15:29:10
【问题描述】:

我有这样的代码来检查请求中是否包含 POST 参数:

def login(request):
    required_params = frozenset(('email', 'password'))
    if required_params <= frozenset(request.POST):
        # 'email' and 'password' are included in the POST request
        # continue as normal
        pass
    else:
        return HttpResponseBadRequest()

当所需的 POST 参数列表很大时,此代码会变得混乱。我想做的是:

@required_POST_params('email', 'password')
def login(request):
    # 'email' and 'password' are here always!
    pass

那么我确信 'email' 和 'password' POST 参数都包含在请求中,因为如果没有,请求将自动返回 HttpResponseBadRequest()

有没有 Django 允许我这样做的方法,如果没有,我怎么能自己用装饰器来做呢?

【问题讨论】:

    标签: python django django-views python-decorators


    【解决方案1】:

    您需要一个自定义装饰器,但您可以将require_http_methods 作为基本示例:

    def require_post_params(params):
        def decorator(func):
            @wraps(func, assigned=available_attrs(func))
            def inner(request, *args, **kwargs):
                if not all(param in request.POST for param in params):
                    return HttpResponseBadRequest()
                return func(request, *args, **kwargs)
            return inner
        return decorator
    

    示例用法:

    @require_post_params(params=['email', 'password'])
    def login(request):
        # 'email' and 'password' are here always!
        pass
    

    仅供参考,require_http_methods source code

    【讨论】:

      【解决方案2】:

      我正在分享我的解决方案;

      __author__ = 'yagmurs'
      from copy import deepcopy
      from rest_framework import status
      from rest_framework.response import Response
      
      def require_params(*params):
          def decorator(fn):
              def wrapped_function(request, *args, **kwargs):
                  """
                  Decorator for django rest service to meet both GET and POST request
                  """
                  error = deepcopy(REQUEST_INVALID_400)
                  is_param_missing = False
                  for param in params:
                      if not get_param_from_request(param, request):
                          error['result_message'] += param + ", "
                          is_param_missing = True
                  if is_param_missing:
                      error['result_message'] = error['result_message'][:-2]
                      return Response(error, status=status.HTTP_400_BAD_REQUEST)
                  else:
                      return fn(request, *args, **kwargs)
              return wrapped_function
          return decorator
      
      
      def get_param_from_request(param, request):
          if request.method == 'POST':
              return request.data.get(param)
          else:
              return request.query_params.get(param)
      

      【讨论】:

        【解决方案3】:

        试试this

        试试require.POST(),而不是require.POST('email', 'password')

        【讨论】:

          猜你喜欢
          • 2015-06-25
          • 2021-04-14
          • 2013-02-24
          • 2016-08-21
          • 2020-06-24
          • 2018-11-23
          • 2014-07-21
          • 2014-11-03
          • 2014-10-15
          相关资源
          最近更新 更多