首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django 2中间件中url路径的比较

Django 2中间件中url路径的比较
EN

Stack Overflow用户
提问于 2019-02-20 22:37:26
回答 1查看 1.3K关注 0票数 1

我需要开发Django中间件并创建如下类:

代码语言:javascript
复制
import re
from django.conf import settings
from django.shortcuts import redirect
from django.contrib.auth import logout


class LoginRequiredMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        assert hasattr(request, 'user')

        path = request.path_info
        print(path)

        p = path.lstrip('/')
        compiled_login_url = re.compile(settings.LOGIN_URL)

        print(compiled_login_url.match(p))


        if not request.user.is_authenticated:
            if path == '/':
                print("==============> INDEX PAGE")

现在,我想比较一下urls的路径。我必须确定路径是否与settings.LOGIN_URL匹配。我试过使用正则表达式,但它们没有帮助。

这是我的网址

代码语言:javascript
复制
urlpatterns = [
              path('admin/', admin.site.urls),
              path('', views.index, name='index'),
              path('<slug:slug>/', include('app.urls')),
              path('<slug:slug>/accounts/login/', views.login, name='login'),
              path('<slug:slug>/accounts/logout/', views.logout, name='logout'),
              path('<slug:slug>/dashboard/', 'views.dashboard', name='dashboard'),
          ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我想要免除登录、注销在中间件中的签入,我也需要段塞

views.py

代码语言:javascript
复制
def user_login(request, slug):
    """
    Login user using email and password

    :param request: WSGI Request
    :param slug: to verify the facility
    :return: login page or redirect
    """

    context = {}
    try:
        facility = models.Facility.objects.get(slug=slug)
        context['facility'] = facility

    except models.Facility.DoesNotExist:
        return redirect('index')

    if request.method == "POST":
        email = request.POST['email']
        password = request.POST['password']

        user = authenticate(request, username=email, password=password)
        if user is not None:
            if user.profile.facility.slug == slug:
                login(request, user)
                return redirect('dashboard', slug=slug)
            else:
                context['error'] = "You don't belong to this facility"

        else:
            context['error'] = "Invalid email or password"

    return render(request, 'app/user/login.html', context)


@login_required
def dashboard(request, slug):
    """
    Display the dashboard of facility and list down bird
    view for the daily, weekly, monthly and yearly progress

    :param request:
    :return:
    """
    context = {}

    try:
        facility = models.Facility.objects.get(slug=slug)
        context['facility'] = facility
    except models.Facility.DoesNotExist:
        return render(request, 'app/404.html', status=404)

index.html

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    {% for f in facilities %}
        <li><a href="{% url 'login' f.slug %}">{{ f.name }}</a></li>
    {% empty %}
        <li>No Facility</li>
    {% endfor %}
</ul>
</body>
</html>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-21 05:59:11

您可以将Django的auth视图一个一个地添加到您的urlpatterns中,用login_exempt来装饰每个视图。

如果您想将检查移到中间件中,您可以尝试这样的方法:

urls.py

代码语言:javascript
复制
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include("myapp.urls")),
    path('accounts/', include('django.contrib.auth.urls', namespace="accounts"))
] 

middleware.py

代码语言:javascript
复制
class LoginRequiredMiddleware:            # <-- Custom Middleware
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        return self.get_response(request)

    def process_view(self, request, view_func, view_args, view_kwargs):

        if getattr(view_func, 'login_exempt', False):
            return

        if 'accounts' in request.resolver_match.namespaces:
            return

其他可能性可能是检查中间件中的url或视图名称,但最干净的可能仍然是使用您的装饰器并逐个添加必要的视图。

为此您可以使用django-装潢师-包括

代码语言:javascript
复制
$ pip install django-decorator-include

在你的project/url.py

代码语言:javascript
复制
from decorator_include import decorator_include
from project/custom_middleware import login_exempt


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include("myapp.urls")),
    # do this 
    path('accounts/', decorator_include(login_exempt, 'django.contrib.auth.urls'))


]

不要忘记在requirements.txt中添加包

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54796356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档