Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建中间件在url发现之前拦截请求,以便未经授权的用户无法了解url?_Python_Django_Django Rest Framework_Middleware - Fatal编程技术网

Python 如何创建中间件在url发现之前拦截请求,以便未经授权的用户无法了解url?

Python 如何创建中间件在url发现之前拦截请求,以便未经授权的用户无法了解url?,python,django,django-rest-framework,middleware,Python,Django,Django Rest Framework,Middleware,我被要求为我公司的Django项目编写一个中间件,以避免在访问admin/页面时重复用于用户身份验证的代码。为此,我编写了一个基本的LoginRequiredMiddleware 我用尽了我对中间件的知识,现在我必须给它一些类固醇,这样它可以避免外部各方发现我们项目中的现有视图,特别是对于我们的/api/ 现在,当有人试图访问如下内容时:api/v1/existing page,Django会遍历url,当它找到url视图对时,它会进行身份验证,中间件就会出现 但是,如果未经身份验证的用户尝试访

我被要求为我公司的Django项目编写一个中间件,以避免在访问
admin/
页面时重复用于用户身份验证的代码。为此,我编写了一个基本的
LoginRequiredMiddleware

我用尽了我对中间件的知识,现在我必须给它一些类固醇,这样它可以避免外部各方发现我们项目中的现有视图,特别是对于我们的
/api/

现在,当有人试图访问如下内容时:
api/v1/existing page
,Django会遍历url,当它找到url视图对时,它会进行身份验证,中间件就会出现

但是,如果未经身份验证的用户尝试访问:
api/vi/foo不存在/
页面,则我会得到一个
未找到
页面(错误404)。我希望在Django开始扫描现有URL之前,让中间件拦截请求并请求用户身份验证(错误401 unauthorized)。这是一种安全措施,防止任何人了解项目的现有URL/视图

问题是我不知道从哪里开始

  • 这可以通过中间件实现吗
  • 如果是,我可以使用相同的中间件,还是最好编写一个单独的中间件
  • 我究竟怎样才能让它在URL发现之前拦截请求

  • 您可以编写自定义404处理程序来执行此操作:

    # views.py
    from django.shortcuts import redirect
    from django.views.defaults import page_not_found
    
    def custom_404_handler(request, exception):
        if request.user.is_authenticated:
            # return your own custom 404 page here, or use the
            # default one if you haven't written one:
            return page_not_found(request, exception)
        
        # For unauthenticated users instead of returning a 404
        # redirect them to a login page
        return redirect("login_view")
    
    您还可以添加一些额外的逻辑,以便仅对某些路径执行此操作,例如,仅对以api开头的路径等

    中间件方式
    但是这个想法是URL没有解析。说一个未在我的
    URL\u模式中列出的URL
    。我仍然希望将未经身份验证的用户重定向到登录页面,这样用户就不会知道该URL是否确实存在并与视图匹配,因为他首先被授权页面截获了啊,好的。这其实很容易。我会更新我的答案。
    # urls.py
    ...
    handler404 = "dotted.path.to.views.custom_404_handler"
    
    class MyMiddleware:
    
        def __call__(self, request):
            # your other logic here
            response = self.get_response(request)
             
            if response.status == 404 and not request.user.is_authenticated:
                return redirect("login_view")
    
            return response