簡體   English   中英

我可以更改Django-CMS中所有頁面的默認`login_required值嗎?

[英]Can I change the default `login_required value for all pages in Django-CMS?

我的任務是創建僅對登錄用戶可用的Django-CMS Web應用程序。 經過一番苦苦掙扎之后,我決定只檢查所有頁面的權限上的“需要登錄”,但是手動執行此操作很麻煩(忘記設置為true可能會很危險。

所以我想知道:是否有辦法更改django-cms的pagemodel.pylogin_required BooleanField的默認值? 或者,也許我可以以某種方式覆蓋API的create_page方法以將默認值放在那里?

我不知道將來是否會出現某些情況,我們希望有一些公共可用的頁面,但是如果還有另一種方法,而不是在每個頁面上將此標志設置為true,請讓我知道。 我正在使用Python 2.7.x,Django 1.11.x和Django-CMS 3.4.6。

只需創建一些中間件,即可處理所有請求並確保用戶已登錄。

文件在這里; https://docs.djangoproject.com/en/2.0/topics/http/middleware/#writing-your-own-middleware

你會做類似的事情;

def process_request(self, request):

    if not request.user.is_authenticated():
        return HttpResponseRedirect('login')

我一直在努力使相同的東西在Django 2中運行。這里有很多貼子,其中包含一些零碎的相關信息,但是我無法使用其中的任何答案。 這是我在Django 2.1中的工作方式:

  1. 在您的project目錄中創建一個名為middleware的新目錄(在該目錄中可以找到settings.py
  2. 在該目錄中創建一個名為login_middleware.py的新文件。 為了讓Django激活此文件,您還需要將__init__.py添加到該目錄中。
  3. login_middleware.py ,您將在下面看到代碼。
  4. 現在,您應該將此行添加到MIDDLEWARE列表中,以將其添加到settings.py文件中: 'your_project_name.middleware.login_middleware.AlwaysForceLogin',

    • login_middleware =文件名(login_middleware.py)
    • AlwaysForceLogin =類的名稱(請參見下文)

login_middleware.py內容:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect

class AlwaysForceLogin(MiddlewareMixin):

    def process_request(self, request):
        print("Processing now...")
        if not request.user.is_authenticated and not 'login' in request.GET:
            return redirect('/login?login=true')

重要說明:由於甚至登錄頁面也被重定向,因此我陷入了無限循環。 這種相當丑陋的“未登錄request.GET登錄” hack似乎不是最佳選擇,但目前我沒有更好的解決方案。 公開征求意見。

├── mysite
│   ├── manage.py
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   │   ├── middleware
|   │   │   ├── login_middleware.py

我最終這樣做如下:

在項目的middleware.py我放置了以下內容:

從django.contrib.auth.decorators導入login_required

def login_exempt(view):
    view.login_exempt = True
    return view


class LoginRequiredMiddleware:
    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 'admin/login' in request.path:
            return

        if request.user.is_authenticated:
            return

        return login_required(view_func)(request, *view_args, **view_kwargs)

我必須將其添加到settings.pyMIDDLEWARE列表中,作為'my_project.middleware.LoginRequiredMiddleware'

然后在我的urls.py我不得不只裝點那些應該要求驗證的網址:

urlpatterns += i18n_patterns(
    url(r'^admin/', include(admin.site.urls)),
    url(r'^login/$', login_exempt(my_project_views.login_user), name='login'),
    url(r'^login$', login_exempt(my_project_views.login_user), name='login'),
    url(r'^logout$', login_exempt(my_project_views.logout_user), name='logout'),
    ...
    url(r'^', include('cms.urls')),
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM