Python 登录\所需的装饰程序在django中工作不正常

Python 登录\所需的装饰程序在django中工作不正常,python,django,Python,Django,我正在django建立一个网站。我使用了login_required decorator来防止用户在没有成功登录的情况下移动到UserView。但我遇到了一个问题,即即使在成功登录身份验证之后,它也不会从登录页面移动,而是停留在登录页面上。我做错了什么 这是我的密码: view.py def LoginView(request): if request.method=='POST': username=request.POST.get('username')

我正在django建立一个网站。我使用了login_required decorator来防止用户在没有成功登录的情况下移动到UserView。但我遇到了一个问题,即即使在成功登录身份验证之后,它也不会从登录页面移动,而是停留在登录页面上。我做错了什么

这是我的密码:

view.py

def LoginView(request):
    if request.method=='POST':
        username=request.POST.get('username')
        password=request.POST.get('password')
        try:
            user_info=User_Registration.objects.get(username=username)
           
            if user_info.password==password:
                return redirect("userview")
            else:

                   messages.info(request,"Invalid Password")
        except User_Registration.DoesNotExist:
            messages.info(request,"User Doesn't exist")
    else:

        return render(request,'login.html')

@login_required(login_url="login_view")
def UserView(request):
    return render(request,'user.html')
url.py

from django.urls import path
from post_app import views

urlpatterns=[
    # path('',views.MainPageView.as_view()),
    path('/login',views.LoginView,name='login_view'),
    path('/userview',views.UserView,name='userview'),
    path('/registration',views.RegistrationView,name='registration_view'),
    path('new_job/<str:id>',views.post_new_job,name='new_job')
    
]
从django.url导入路径
从post_应用程序导入视图
URL模式=[
#路径(“”,views.MainPageView.as_view()),
路径('/login',views.LoginView,name='login\u view'),
路径('/userview',views.userview,name='userview'),
路径('/registration',views.RegistrationView,name='registration\u view'),
路径('new\u job/',views.post\u new\u job,name='new\u job')
]
login.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<link rel="stylesheet" href="{% static 'login.css' %}">
<!------ Include the above in your HEAD tag ---------->

<body>
    <div id="login">
        <h3 class="text-center text-white pt-5">Login form</h3>
        <div class="container">
            <div id="login-row" class="row justify-content-center align-items-center">
                <div id="login-column" class="col-md-6">
                    <div id="login-box" class="col-md-12">
                        <form id="login-form" class="form" action="" method="POST">
                            {% csrf_token %}
                            <h3 class="text-center text-info">Login</h3>
                            <div class="form-group">
                                <label for="username" class="text-info">Username:</label><br>
                                <input type="text" name="username" id="username" class="form-control">
                            </div>
                            <div class="form-group">
                                <label for="password" class="text-info">Password:</label><br>
                                <input type="password" name="password" id="password" class="form-control">
                            </div>
                            <div class="form-group">
                              
                                <input type="submit" name="submit" class="btn btn-info btn-md" value="submit">
                            </div>
                            <div id="register-link" class="text-right">
                                <a href="{% url 'registration_view' %}" class="text-info">Register here</a>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>


    <div>
        {% for message in messages %}
        <br>
        <h2  style="padding-left: 500px;" >{{message}}</h2>
        {% endfor %}
    </div>

</body>

</html>
{%load static%}
文件
登录表格
{%csrf_令牌%}
登录
用户名:
密码:
{消息%中的消息为%s}
{{message}} {%endfor%}
视图。py:

 @login_required
 def UserView(req):
     return render(req,"user.html")
LOGIN_URL = '/accounts/login/'  #Define your login page url..
设置。py:

 @login_required
 def UserView(req):
     return render(req,"user.html")
LOGIN_URL = '/accounts/login/'  #Define your login page url..
在your views.py中:

    if user_info.password == password: # I am not sure this is good way.
        return redirect("userview") # You cannot login here. If password equal password. This will redirect userview without login

请像这样使用:

   from django.contrib.auth import login, authenticate # You need add this functions
   
   def LoginView(request):
       if request.method=='POST':
           username=request.POST.get('username')
           password=request.POST.get('password')
           user = authenticate(username=username, password=password) # You can control user with this function. If username and password are correct, this function will return this user. If incorrect, this will return None.
           if user is None:
                messages.info(request,"Username or password incorrect")
                return redirect("login_view")
           else:
               login(request, user) # You can login with this function
               messages.success(request, "You have successfully logged in")
               return redirect("userview")
        return render(request,'login.html')
    
    @login_required(login_url="login_view") # And now You can access this view. Because you logged in with login function
    def UserView(request):
        return render(request,'user.html')


我的英语水平不好,但我试着解释。

Redirct方法接受3种类型的参数

  • 模型:将调用模型的get_absolute_url()函数
  • 视图名称(可能带有参数):reverse()将用于反向解析 名字
  • 绝对或相对URL,将用作重定向位置的原样

  • 确保使用了正确的视图名称。

    在研究解决类似问题的方法后,您可以尝试:

    • 正在从浏览器中删除缓存
    此外,由于登录url对于网站是静态的。您可以在
    settings.py
    中定义您的
    login\u url
    ,如下所示:

    LOGIN_URL = '/post_app/login'
    

    然后,您不必在使用它的任何地方定义登录url。否则,一切看起来都很好。

    您的代码没有遵循在Django中实现身份验证/授权的最佳实践。无论如何,让我来演示如何修复现有代码以使其正常工作

    def LoginView(request):
        if request.method=='POST':
            username=request.POST.get('username')
            password=request.POST.get('password')
            try:
                user_info=User_Registration.objects.get(username=username)
               
                if user_info.password==password:
                    return redirect("userview")
                else:
                    messages.info(request,"Invalid Password")
            except User_Registration.DoesNotExist:
                messages.info(request,"User Doesn't exist")
        return render(request,'login.html')
    
    @login_required(login_url="login_view")
    def UserView(request):
        return render(request,'user.html')
    
    那怎么了?如果用户不存在或输入了无效密码,您什么也不做,只需添加一条错误消息。添加消息时,应呈现模板,在模板中迭代所有消息。更多信息请点击此处

    与此同时,这仍可能无法如预期那样发挥作用。我有一系列问题要问你:

  • 您是否获得原始格式的密码?我的意思是一个带密码的字符串,没有哈希和任何其他保护
  • 如何在
    用户注册
    型号中存储密码?它也是一个带有密码的字符串还是散列字符串
  • 我还有一长串代码的进一步改进,但是让我们先找出错误


    更新(2020年9月22日)

    因为你得到了页面刷新,你仍然在登录页面上-我认为重定向代码没有被调用。这意味着您应该看到您添加的其中一条消息。请在模板呈现期间尝试向上下文添加消息。让我们检查一下您将看到哪些消息

    def LoginView(请求):
    if request.method==“POST”:
    username=request.POST.get('username')
    password=request.POST.get('password')
    尝试:
    user\u info=user\u Registration.objects.get(username=username)
    如果用户信息密码==密码:
    返回重定向(“用户视图”)
    其他:
    messages.info(请求“无效密码”)
    除用户\注册.DoesNotExist外:
    messages.info(请求“用户不存在”)
    返回呈现(请求'login.html'{
    “消息”:消息。获取消息(请求)
    })
    @需要登录(登录url=“登录视图”)
    def用户视图(请求):
    返回呈现(请求'user.html')
    
    如果您仍然无法收到任何消息,我们可以尝试将这两条
    消息.info
    替换为
    raise
    。因此,应用程序将在其中一个位置失败。但是让我们先尝试显式地传递消息

    让信息发挥作用的清单

  • “django.contrib.messages”在已安装的应用程序中
  • 中间件包含“django.contrib.sessions.MIDDLEWARE”和“django.contrib.messages.MIDDLEWARE.MessageMiddleware”
  • 在模板设置中定义的DjangoTemplates后端的“context_processors”选项包含“django.contrib.messages.context_processors.messages”

  • 你能给我们看一下你的
    url.py
    url.py已经显示了。请检查我的答案。我想我可以帮助你对这个主题有深入的了解。好的,我明白了,我会在我的代码中修改它,但在某些情况下我仍然需要应用decorator,我该怎么做?你可以用decorator来处理这个,您必须使用:)请稍候,我将立即在数据库中以字符串形式编辑我的答案密码存储,而不进行哈希运算。不幸的是,没有。@DavidGardner您能试试我的代码并告诉我您遇到了什么问题吗。谢谢。同样的问题是它没有移动到用户视图并且停留在登录页面上。我试过你的代码。页面刷新了吗?