我的任务是创建仅对登录用户可用的Django-CMS Web应用程序。经过一番苦苦挣扎之后,我决定只检查所有页面的权限上的“需要登录”,但是手工操作很麻烦(忘记设置为true可能会很危险。
所以我在想:是否可以更改django-cms的login_required
上BooleanField
pagemodel.py
的默认值?或者,也许我可以以某种方式重写API的create_page
方法以将默认值放在那里?
我不知道将来是否会出现某些情况,我们希望有一些公共可用的页面,但是如果还有另一种方法,而不是在每个页面上将此标志设置为true,请告诉我。我正在使用Python 2.7.x,Django 1.11.x和Django-CMS 3.4.6。
答案 0 :(得分:0)
只需创建一些中间件,即可处理所有请求并确保用户已登录。
文档在这里; 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')
答案 1 :(得分:0)
我一直在努力使相同的东西在Django 2中运行。这里有很多帖子,其中包含了一些零碎的相关信息,但是我无法使用其中的任何答案。这是我如何在Django 2.1中使用它的方法:
middleware
目录(与您找到settings.py的目录相同)中创建一个名为project
的新目录。
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
答案 2 :(得分:0)
我最终如下进行操作:
在项目的AppState.addEventListener('change', this._handleAppStateChange);
中,我放置了以下内容:
从django.contrib.auth.decorators导入login_required
middleware.py
我必须将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
的{{1}}列表中。
然后在我的MIDDLEWARE
中,我只需要修饰那些不需要需要身份验证的URL:
'my_project.middleware.LoginRequiredMiddleware'