django 在列表中使用正则表达式排除 url

Posted

技术标签:

【中文标题】django 在列表中使用正则表达式排除 url【英文标题】:django exclude urls using regular expression in list 【发布时间】:2019-05-16 21:41:13 【问题描述】:

我正在使用 django 2.1 版中的Middleware。这是LoginMiddleWare,如果requested url exits返回None,我需要排除一些网址

下面是中间件代码部分:middleware.py

def process_view(self, request, view_func, view_args, view_kwargs):
    exclude_urls = [r'[admin]', r'[login]', r'[register]', r'[demo]']

    if(request.path_info in exclude_urls):
        print('BELOW IS EXCLUDED URL')
        print(request.path_info)
        return None
    else:
        print('BELOW IS NOT EXCLUDED URL')
        print(request.path_info)

上面的代码必须识别用户request.path_info请求的url,并且必须检查exclude_urls中的退出

示例:如果请求的 url 是 https://www.example.com/login?query=1,则必须在该特定 url 中标识 login,并且必须返回 None

编辑 1

在查看我的代码后,下面给出了解决方案

    url_list = [
        'admin/login',
        '/demo/login'
    ]

    requested_path = request.path_info
    print('requested path :'+requested_path)
    for i in url_list:
        r1 = re.findall(r'^'+requested_path, i)
        print(len(r1))

        if len(r1) > 0:
            return None
        else:
            if not request.session.get('user_logged', None):
                print("Session Empty")
                return redirect('login') //HERE USER IS GOING INTO CONTINUOUS REDIRECT LOOP HOW CAN I STOP INFINITE REDIRECTS
            else:
                print("Session Exits")

上述代码更改在某些扩展 NOW THE ISSUE IS IT REDIRECTING TO https://www.example.com/demo/login 页面中一次又一次地起作用我该如何阻止它。

编辑 2

我想要实现的目标

admin/login and demo/login 目前是我在检查session exits in middleware.py 时需要排除的两个网址

案例 1: 如果列表中存在 URL 并且会话为空并且用户有 REQUESTED demo/login url,我需要他重定向到他的 url demo/login url

案例 2: 如果用户请求的 URL 不是 list url_list 中提到的 URL。否则,我正在检查会话是否为空,然后我将用户重定向到 demo/login 页面[## 但用户正在进入连续的重定向循环我如何才能停止无限重定向##]

提前致谢

【问题讨论】:

这里没有正则表达式。正则表达式中的方括号(如果是的话)表示“字符列表”。所以 r'[admin]' 代码将匹配 admin (len=1)。删除所有“正则表达式”尝试,获取 url 开头的子字符串并与简单列表进行比较以包含(您已经完成的操作)。 @Ivan Starostin 感谢您的回复。我在下面编辑了我的问题。请做必要的事情。 return redirect('login') ? 你想完成什么?禁止匿名访问除login/register以外的所有页面? 大写字母不会让模糊的想法更清晰。 【参考方案1】:

假设您使用的是named urls,那么您可以像这样使用它:

url_list = [
    'admin:login',
    'demo:login'
]

curl = request.resolver_match.view_name
if curl in url_list:
   if request.session.get('user_logged'):
       return redirect('/already-logged-in')  # make a new url for this
else:
   if not request.session.get('user_logged'):
       return redirect('/login')

【讨论】:

答案略有不同 我正在寻找不同的解决方案以使问题更清楚 我已经添加了有关成就的更多详细信息。请给有需要的人。 对于第一种情况,您需要停止重定向,因为已经请求用户登录。这应该会停止你的无限循环重定向 @PavanWebbeez 查看更新后的答案。并且不要使用 Caps Lock,它不可读。 很遗憾结果没有改变。

以上是关于django 在列表中使用正则表达式排除 url的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式仅排除具有 .css 或 .png 文件扩展名的 url,但允许所有其他 url

Django中的Slug Url正则表达式

Chrome 开发工具:有啥方法可以排除 URL 与正则表达式匹配的请求?

排除正则表达式搜索中的单词列表

如何在我的 Django urls.py 中使用单个正则表达式捕获多个参数?

使用 django 的 URL 和正则表达式