Python 在Django中,如何在decorator函数中的请求对象中设置值,并从decorator函数中的请求对象访问该值

Python 在Django中,如何在decorator函数中的请求对象中设置值,并从decorator函数中的请求对象访问该值,python,django,django-rest-framework,django-authentication,django-middleware,Python,Django,Django Rest Framework,Django Authentication,Django Middleware,我已经使用django实现了后端api。环境详情如下:- 环境: 平台:Linux(ubuntu) 框架:Django 1.11.28 编程语言:Python2.7.12(计划将来移植3.8) 数据库:Mongodb 3.4 说明: 我已经使用django开发了web服务。这些都是简单的web服务,不是Restful的(之前没有完全支持mongodb for Django rest框架),因此大多数东西都不是按照Django标准定制的 发行详情: 对于身份验证,我使用Azure AD。我编写了一

我已经使用django实现了后端api。环境详情如下:-

环境: 平台:Linux(ubuntu) 框架:Django 1.11.28 编程语言:Python2.7.12(计划将来移植3.8) 数据库:Mongodb 3.4

说明: 我已经使用django开发了web服务。这些都是简单的web服务,不是Restful的(之前没有完全支持mongodb for Django rest框架),因此大多数东西都不是按照Django标准定制的

发行详情: 对于身份验证,我使用Azure AD。我编写了一个简单的decorator,它从front web app/mobile发送的请求接收访问令牌,然后这个decorator验证令牌并返回视图。对于身份验证,我使用django auth adfs包

室内装修设计师 授权书 View.py 正如您所看到的,代码变得凌乱,重复代码。在视图中,我无法访问已在视图中解码的用户详细信息。为了获取用户详细信息,我通过传递请求对象在get_userinfo_from_access_token()函数中编写了相同的代码,我认为这不接近“ok”

  • 我需要的方法是按照django标准,并遵循大多数django开发人员。我是否需要实现一些认证后端或django中间件?如果需要,请指导我完成
考虑到我目前的情况和环境

  • 您能否解释从请求对象访问用户详细信息的最佳和标准方法
  • 我创建了很多视图,我正在为每个视图添加is\u authorizeddecorator。是否有任何标准和更好的方法来保护视图
  • 我计划将来使用django rest框架重写整个代码。如果有人能为我提供一些实现RESTfulWeb服务的参考或指南,以便我能够使用现有代码并减少工作量,我将非常感激
  • 请让我知道,如果我不清楚什么和更多的细节要求。
    提前谢谢。

    好的。让我按顺序给你答案

  • 基于数据库查询中的令牌编写中间件并附加用户
  • 创建另一个中间件,仅当用户通过上述(1)个中间件的身份验证时才允许受保护路径
  • 随着django的日新月异,如果您在休息时单独问一个问题将更好。我知道标准,但现在回答可能会过时 现在回到中间产品中间件按顺序工作。无效的顺序可能不起作用

    第一中间件

    class UserResolverMiddleware(MiddlewareMixin):
        """
        A middleware class that adds a ``user`` attribute to the current request.
        """
    
        def process_request(self, request):
            """
    
            get token from request header
            validate token
            decode the token
            query on db or attach a fake user with necessary decoded data. 
            attach user object to request like request.user = user
            """
    
    第二个

    from django.http import HttpResponseForbidden
    class ProtectedViewMiddleware(MiddlewareMixin):
    
    
        def process_request(self, request):
    
            """
            create a list of URL which is not protected (e.g: login, forget password)
            unprotected_list = ['']
            if request url does not belongs to unprotected_list and request has no attribue user:
    
                return  HttpResponseForbidden()
            return 
            """
    

    谢谢你的回复。你们能详细说明一下第二个中间件的需求吗?若我不使用第二个中间件,这将如何影响我的安全性呢?第二个中间件是作为授权的装饰者工作的。is用户未经过身份验证,但希望在受保护视图中访问,我们将忽略它们。如果不使用此中间件,则必须在每个受保护的视图中处理auth。我可以将排除的url放在1中提到的同一中间件中,这将不会处理令牌身份验证。但如果我写了另一个中间件,请纠正我,它不会在第一个中间件之后执行吗。所以对于未经身份验证的用户访问的视图将不起作用。您能否提供上述第二个中间件的示例,这将进一步澄清并帮助我理解。现在我能够实现预期的目标,但我希望遵循标准方法。在这之后,我可以把它标记为我的问题的答案。@sachin27,请看一看
    class UserResolverMiddleware(MiddlewareMixin):
        """
        A middleware class that adds a ``user`` attribute to the current request.
        """
    
        def process_request(self, request):
            """
    
            get token from request header
            validate token
            decode the token
            query on db or attach a fake user with necessary decoded data. 
            attach user object to request like request.user = user
            """
    
    from django.http import HttpResponseForbidden
    class ProtectedViewMiddleware(MiddlewareMixin):
    
    
        def process_request(self, request):
    
            """
            create a list of URL which is not protected (e.g: login, forget password)
            unprotected_list = ['']
            if request url does not belongs to unprotected_list and request has no attribue user:
    
                return  HttpResponseForbidden()
            return 
            """