我可以更改Django-CMS中所有页面的默认`login_required值吗?

时间:2018-08-01 14:43:46

标签: python django python-2.7 django-cms

我的任务是创建仅对登录用户可用的Django-CMS Web应用程序。经过一番苦苦挣扎之后,我决定只检查所有页面的权限上的“需要登录”,但是手工操作很麻烦(忘记设置为true可能会很危险。

所以我在想:是否可以更改django-cms的login_requiredBooleanField pagemodel.py的默认值?或者,也许我可以以某种方式重写API的create_page方法以将默认值放在那里?

我不知道将来是否会出现某些情况,我们希望有一些公共可用的页面,但是如果还有另一种方法,而不是在每个页面上将此标志设置为true,请告诉我。我正在使用Python 2.7.x,Django 1.11.x和Django-CMS 3.4.6。

3 个答案:

答案 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中使用它的方法:

  1. middleware目录(与您找到settings.py的目录相同)中创建一个名为project的新目录。
  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

答案 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'