Python 登录\所需的装饰程序在django中工作不正常
我正在django建立一个网站。我使用了login_required decorator来防止用户在没有成功登录的情况下移动到UserView。但我遇到了一个问题,即即使在成功登录身份验证之后,它也不会从登录页面移动,而是停留在登录页面上。我做错了什么 这是我的密码: view.pyPython 登录\所需的装饰程序在django中工作不正常,python,django,Python,Django,我正在django建立一个网站。我使用了login_required decorator来防止用户在没有成功登录的情况下移动到UserView。但我遇到了一个问题,即即使在成功登录身份验证之后,它也不会从登录页面移动,而是停留在登录页面上。我做错了什么 这是我的密码: view.py def LoginView(request): if request.method=='POST': username=request.POST.get('username')
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种类型的参数
确保使用了正确的视图名称。在研究解决类似问题的方法后,您可以尝试:
- 正在从浏览器中删除缓存
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
。因此,应用程序将在其中一个位置失败。但是让我们先尝试显式地传递消息
让信息发挥作用的清单
你能给我们看一下你的
url.py
url.py已经显示了。请检查我的答案。我想我可以帮助你对这个主题有深入的了解。好的,我明白了,我会在我的代码中修改它,但在某些情况下我仍然需要应用decorator,我该怎么做?你可以用decorator来处理这个,您必须使用:)请稍候,我将立即在数据库中以字符串形式编辑我的答案密码存储,而不进行哈希运算。不幸的是,没有。@DavidGardner您能试试我的代码并告诉我您遇到了什么问题吗。谢谢。同样的问题是它没有移动到用户视图并且停留在登录页面上。我试过你的代码。页面刷新了吗?