如何使@login_required可选

时间:2016-03-16 14:02:28

标签: python django django-templates

我有一个django网页,我想向每个用户显示,无论他是否登录。

鉴于django项目,我添加了装饰器@login_required

    @login_required(login_url='/login')
    def home(request):
       current_user = str(request.user)
       data = {}
       data['current_user'] = current_user

使用户重定向到登录页面。

但是因为我希望用户查看数据,即使他没有登录,如果他想登录,也可以在同一页面上打开弹出窗口(型号)登录。

所以我删除了@login_required指令。但是当用户尝试登录时失败并出现以下错误:

    username = request.POST['username']
File "/home/jay/jay/at_jay/local/lib/python2.7/site-packages/django/utils/datastructures.py", line 85, in __getitem__
    raise MultiValueDictKeyError(repr(key))
MultiValueDictKeyError: "'username'"

任何帮助将不胜感激。

完整追溯:

inside login block Internal Server Error: /login/ Traceback (most recent call last):   
File "site-packages/django/core/handlers/base.py", line 149, in get_response
  response = self.process_exception_by_middleware(e, request)   
File "site-packages/django/core/handlers/base.py", line 147, in get_response
  response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/jay/jay/AutoTriage/dashboard/views.py", line 160, in login_user
  username = request.POST['username']   
File "site-packages/django/utils/datastructures.py", line 85, in __getitem__
  raise MultiValueDictKeyError(repr(key)) MultiValueDictKeyError: "'username'" [16/Mar/2016 13:58:46] "POST /login/ HTTP/1.1" 500 67952

2 个答案:

答案 0 :(得分:1)

您需要能够同时处理已登录和未登录的用户。您可以使用Django的AnonymousUser类和request.user.is_authenticated

来完成此操作

有关示例,请参阅here

答案 1 :(得分:1)

Django附带built in authentication views。我建议你使用它们,而不是写自己的观点来登录。

如果您不使用它们,最好使用forms,而不是直接从request.POST获取数据。

如果您坚持从if 'username' in request.POST: username = request.POST['username'] else: # do something else 获取数据,则需要在密钥不存在时处理该情况。您可以通过检查密钥是否存在来执行此操作,

get()

或使用username = request.POST.get('username', 'default') 方法。

MTLRenderPipelineState