gpt4 book ai didi

python - Django 上下文处理器登录问题

转载 作者:行者123 更新时间:2023-12-01 19:33:46 25 4
gpt4 key购买 nike

我有一个登录系统:

def login(request):
title = "Login"
if request.user.is_authenticated():
return HttpResponseRedirect('/')
form = UserLoginForm(request.POST or None)
if request.POST and form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = auth.authenticate(username=username, password=password)
if user:
auth.login(request, user)
return HttpResponseRedirect("/")# Redirect to a success page.
return render(request, 'accounts/login.html', {'title':title, 'form': form })


def logout(request):
auth.logout(request)
return HttpResponseRedirect('/accounts/login')

而且效果很好。但是,当我尝试添加 context_processor 时,它会停止工作并给我以下错误:

Environment:


Request Method: GET
Request URL: http://localhost:8000/accounts/login/

Traceback:

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
39. response = get_response(request)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
149. response = view_func(request, *args, **kwargs)

File "/Users/andyxu/Documents/ece496-web/capstone/views.py" in login
22. return render(request, 'accounts/login.html', {'title':title, 'form': form })

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/shortcuts.py" in render
30. content = loader.render_to_string(template_name, context, request, using=using)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
68. return template.render(context, request)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/backends/django.py" in render
66. return self.template.render(context)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/base.py" in render
206. with context.bind_template(self):

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py" in __enter__
17. return self.gen.next()

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/context.py" in bind_template
236. updates.update(processor(self.request))

Exception Type: TypeError at /accounts/login/
Exception Value: 'NoneType' object is not iterable

这是我的 context_processor.py:

from matchalgorithm.models import Profile

def add_variable_to_context(request):
if(request.user.id):
profile = Profile.objects.filter(user_id = request.user.id).first()
return {
'main_profile': profile
}

基本上我只想检查用户是否有 Profile 否则返回 None。我想使用这个变量传递到我的 base.html 中,它不会被任何 View 呈现。有趣的是,一旦我登录,它就可以正常工作了!

谢谢

最佳答案

您的上下文处理器上的缩进似乎已关闭,与您的描述不符。我假设 return 语句在 if 语句中,因为它与您的描述和回溯匹配。

docs说(强调我的):

A context processor has a very simple interface: It’s a Python function that takes one argument, an HttpRequest object, and returns a dictionary that gets added to the template context. Each context processor must return a dictionary.

因此,如果您不想在上下文中添加任何内容,您的处理器必须返回一个空字典而不是 None:

def add_variable_to_context(request):
if(request.user.id):
profile = Profile.objects.filter(user_id = request.user.id).first()
return {
'main_profile': profile
}
return {}

关于python - Django 上下文处理器登录问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43173618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com