[英]Can I change the default `login_required value for all pages in Django-CMS?
我的任務是創建僅對登錄用戶可用的Django-CMS Web應用程序。 經過一番苦苦掙扎之后,我決定只檢查所有頁面的權限上的“需要登錄”,但是手動執行此操作很麻煩(忘記設置為true可能會很危險。
所以我想知道:是否有辦法更改django-cms的pagemodel.py
上login_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中的工作方式:
project
目錄中創建一個名為middleware
的新目錄(在該目錄中可以找到settings.py login_middleware.py
的新文件。 為了讓Django激活此文件,您還需要將__init__.py
添加到該目錄中。 login_middleware.py
,您將在下面看到代碼。 現在,您應該將此行添加到MIDDLEWARE列表中,以將其添加到settings.py
文件中: 'your_project_name.middleware.login_middleware.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.py
的MIDDLEWARE
列表中,作為'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.