Django搭建博客_5:用户登录

a之前创建了超管用户admin,在实际使用中,一般用户是 不能轻易登录管理后台的,非管理员用户最好是从前台登录,登录之后仅具有所规定的功能。

1 创建应用

为了实现用户登录,退出,注册等功能,从而进行用户管理,

  • 因此我们要创建一个新的应用account.
python manage.py startapp account
  • 之后在./mysite/settings.py中对新应用进行配置。
INSTALLED_APPS = [
    ...,
    'blog',
    'account',
]
  • 接着就是在./mysite/urls.py中进行URL配置。
urlpatterns = [
    ...,
	url(r'^account/', include('account.urls', namespace='account', app_name='account')),
]
  • 最后在 ./account目录中创建urls.py文件,并设置还本应用的路径。
from django.conf.urls import url
from . import views

from django.conf import settings

urlpatterns = [
    url(r'^login/$', views.user_login, name='user_login'),
]

views.user_login意味着必须要在views.py中创建一个名为user_login的函数来响应请求。

至此,基本配置已经完成。

2 表单类

在用户注册页面,一般都有用户登录框,这里使用表单类来完成该功能。表单是网站交互性的经典方式,主要负责 数据采集的功能。

在./account下创建forms.py文件,代码如下。

from django import forms

class LoginForm(forms.Form):
	username = forms.CharField()
	password = forms.CharField(widget=forms.PasswordInput)

可通过交互模式来理解表单类的概念:

~ python manage.py shell
Python 3.6.0 (default, Mar 29 2020, 19:12:59)
[GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from account.forms import LoginForm
>>> login_form  = LoginForm()
>>> print(login_form)
<tr><th><label for="id_username">Username:</label></th><td><input type="text" name="username" required id="id_username" /></td></tr>
<tr><th><label for="id_password">Password:</label></th><td><input type="password" name="password" required id="id_password" /></td></tr>

打印出来的就是html的代码,浏览器中打开就是用户名密码的输入框。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1NzxksYx-1587127277190)(evernotecid://B1C45E84-DAD5-4A3E-8F09-F042CE8BEC59/appyinxiangcom/9699651/ENResource/p2821)]

查看相关方法:

>>> dir(login_form)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__html__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_bound_fields_cache', '_clean_fields', '_clean_form', '_errors', '_html_output', '_post_clean', 'add_error', 'add_initial_prefix', 'add_prefix', 'as_p', 'as_table', 'as_ul', 'auto_id', 'base_fields', 'changed_data', 'clean', 'data', 'declared_fields', 'default_renderer', 'empty_permitted', 'error_class', 'errors', 'field_order', 'fields', 'files', 'full_clean', 'get_initial_for_field', 'has_changed', 'has_error', 'hidden_fields', 'initial', 'is_bound', 'is_multipart', 'is_valid', 'label_suffix', 'media', 'non_field_errors', 'order_fields', 'prefix', 'renderer', 'use_required_attribute', 'visible_fields']

其中关键的方法有两个:

  • is_valid():如果传递给表达类的数据是正确的,则返回True。这个方法用来验证数据是否合法。

    扫描二维码关注公众号,回复: 11384644 查看本文章
  • cleaned_data:以字典形式返回示例的具体数据,进过校验之后的属性及其值,如果传入的某项数据不合法,则在cleaned_data的结果中不予显示。

3 登录视图

需要完成的功能:

  • 一个是响应GET请求,当用户通过浏览器请求某个网址时,显示登录的对话框;
  • 另外一个是响应POST请求,用户以POST方式向服务器发送自己的用户名和密码,该视图函数接收到后,判断其是否为本站用户,如果是就许可登录,否则拒绝。

编辑./account/views.py文件,实现user_login()的视图函数。

from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from . forms import LoginForm

def user_login(request):
	if request.method == "POST":
		login_form = LoginForm(request.POST)
		if login_form.is_valid():
			cd = login_form.cleaned_data
			user = authenticate(username=cd['username'], password=cd['password'])

			if user:
				login(request, user)
				return HttpResponse("wellcome You. You have been authenticated successfully")
			else:
				return HttpResponse("Sorry,Your  username or password is not right.")
		else:
			return HttpResponse("Invalid login")

	if request.method == "GET":
		login_form = LoginForm()
		return render(request, "account/login.html", {"form": login_form})

4 登录前端页面

接下来要编写./templates/account/login.html模板:

{% extends "base.html" %}
{% block title %}Login{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
	<h1>Login</h1>
	<p>Input your username and password</p>
	<form class="form-horizontal" action="." method="post">  # ①
		{% csrf_token %}  # ②
		{{ form.as_p }}
		<input type="submit" value="Login">
	</form>
</div>
{% endblock %}

代码解释:
语句①中action="."用于显示当前表单的提交地址,这里表示的是当前地址,即调用此模板的额视图函数所对应的URL。

语句②在表单是必不可少的(不写在这里也行,只要在语句中即可)。这是Django自身框架特性,防止CSRF攻击,不允许前端通过POST方式直接提交数据,如果需要提交,就必须在表单中使用{% csrf_token %},与表单一起提交。
CSRF(Cross-Site Request Forgery,跨站请求伪造)是攻击者盗用用户身份,已用户的名义发送恶意请求的攻击

模板编写完成之后,就可以访问http://127.0.0.1:8000/account/login即可查看登录界面。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uKQAoGDp-1587127277192)(evernotecid://B1C45E84-DAD5-4A3E-8F09-F042CE8BEC59/appyinxiangcom/9699651/ENResource/p2823)]

用超管账号创建账号test/2345.com,尝试登录:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XtLqJT5t-1587127277194)(evernotecid://B1C45E84-DAD5-4A3E-8F09-F042CE8BEC59/appyinxiangcom/9699651/ENResource/p2824)]

5 头部基础模板加登录超链

在页面共有头部分,有个登录的超链还未加上,在编写完登录页面后,就可以加上该超链。
修改./templates/header.html中的部分代码

原:
<li><a href="#">LOGIN</a></li>
更改为:
<li><a href={% url 'account:user_login'%}>LOGIN</a></li>

这种超链的写法可以满足代码随意迁移的需要。这里的URL是模板中的标签,表示网址,将程序引导到./mysite/urls.py和./account/urls.py配置中。

6 总结

6.1 内置用户权限管理

使用Djanngo开发网站时,可以使用内置的用户权限管理功能,在./mysite/settings.py文件,会在INTSALLED_APPS的列表中发现你django.contrib.auth应用,这就是默认的用户权限管理应用。其源码也放在本地的安装目录中,~/dist-packages/djanngo/cotrib/auth内。
具体使用可以在官方文档进行深入了解。

6.2 表单的请求响应过程

  1. 用户通过自己浏览器第一次向服务器发出含有表单页面的请求,Django会创建一个未绑定数据的表单实例,如form=LoginForm(),form实例就是未绑定的实例,然后反馈到前端页面,等待用户填写内容。
  2. 用户在客户端填写了表单内容之后,将其提交给服务器,在Django的视图中接收数据,例如form=LoginForm(request.POST),然后验证表单数据。
  3. 通过表单验证之后,可以对表单进行进一步操作,例如报错,URL转向灯,之后本次表单提交过程完毕。
  4. 如果没有通过表单验证,就要返回绑定表单实例,让用户修改之后再次提交。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8z5zTWd-1587127277204)(evernotecid://B1C45E84-DAD5-4A3E-8F09-F042CE8BEC59/appyinxiangcom/9699651/ENResource/p2825)]

猜你喜欢

转载自blog.csdn.net/tt75281920/article/details/105588125
今日推荐