User模块
用户表设计
- username
- password
- phone
- icon(头像)
- is_active
- is_delete
Models.py
用户表模型
class peiqi1user(models.Model):
u_usename = models.CharField(max_length=32, unique=True)
u_password = models.CharField(max_length=256)
u_email = models.CharField(max_length=64, unique=True)
u_icon = models.ImageField(upload_to='icons/%Y/%m/%d/')
is_active = models.BooleanField(default=False)
is_delete = models.BooleanField(default=False)
class Meta:
db_table = 'peiqi1_user'
迁移数据库
创建用户注册页面
新建文件夹user,新建register.html:
之前提到过,每一个模块都有自己的base文件,新建base_user.html:
在base_user.html中先继承base.html,方便之后的操作。
新建register.css文件:
register.html
{% extends 'base_user.html' %} {# 继承 #}
{% load static %}
/*导入css样式*/
{% block ext_css %}
{{ block.super }}
<link rel="stylesheet" href="{% static 'peiqi1/user/css/register.css' %}">
{% endblock %}
{% block header %}
<header></header>
{% endblock %}
{% block content %}
{# 注册表单 #}
<div class="'container">
<form method="post" enctype="multipart/form-data" action="{% url 'peiqi1:register' %}" > {# 指定post请求类型 #}
{% csrf_token %} {# Django自带放跨站攻击 #}
<div class="form-group">
<label for="username_input">用户名</label>
<input name="username" type="text" class="form-control" id="username_input" placeholder="请输入用户名">
</div>
<div class="form-group">
<label for="email_input">邮箱</label>
<input name="email" type="text" class="form-control" id="email_input" placeholder="请输入邮箱">
</div>
<div class="form-group">
<label for="password_input">密码</label>
<input name="password" type="password" class="form-control" id="password_input" placeholder="请输入密码">
</div>
<div class="form-group">
<label for="password_confirm_input">确认密码</label>
<input type="password" class="form-control" id="password_confirm_input" placeholder="请再次输入密码">
</div>
<div class="form-group">
<label for="icon_input">头像</label>
<input name="icon" type="file" id="icon_input"> {# 这里的name是用来给views函数定位,抓取数据存入数据库中的 #}
</div>
<button type="submit" class="btn btn-success btn-block">注册</button>
</form>
</div>
{% endblock %}
添加url:
url(r'^register/', views.register),
views:
def register(request):
if request.method == 'GET':
data = {
'title': '注册'
}
return render(request, 'user/register.html', context=data)
elif request.method == 'POST':
username = request.POST.get('username')
email = request.POST.get('email')
password = request.POST.get('password')
icon = request.FILES.get('icon')
user = peiqi1user()
user.u_usename = username
user.u_password = password
user.u_email = email
user.u_icon = icon
user.save()
return HttpResponse('注册成功')
测试:
观察数据库也有对应数据:
创建用户登录界面
现在创建注册成功时跳转的登录页面。
首先创建login.css,和login.html
base_user.html
{% extends 'base.html' %}
{% load static %}
{% block header %}
<header></header>
{% endblock %}
{{ block.super }}
<link rel="stylesheet" href="{% static 'peiqi1/user/css/user.css' %}">
login.html
{% extends 'base_user.html' %}
{% load static %}
/*导入css样式*/
{% block ext_css %}
{{ block.super }}
{% endblock %}
{% block content %}
{# 注册表单 #}
<div class="'container">
<form method="post" action="{% url 'peiqi1:login' %}" > {# 指定post请求类型 #}
{% csrf_token %} {# Django自带放跨站攻击 #}
<div class="form-group">
<label for="username_input">用户名</label>
<input name="username" type="text" class="form-control" id="username_input" placeholder="用户名/邮箱">
</div>
<div class="form-group">
<label for="password_input">密码</label>
<input name="password" type="password" class="form-control" id="password_input" placeholder="密码">
</div>
<button type="submit" class="btn btn-success btn-block">登录</button>
</form>
</div>
{% endblock %}
urls:
url(r'^login/', views.login, name='login'),
views:
def login(request):
if request.method == 'GET':
data = {
'title': '登录',
}
return render(request, 'user/login.html', context=data)
elif request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
return HttpResponse('登录成功')
测试:
解决注册用户名/邮箱重复时报错
解决方法时是,在注册时,输入完用户名应该进行预校验,会提醒用户名已注册,而不是最后提交时报错。
添加预校验
实际上还是有一个事件触发,内容改变之后并且焦点变化之后,我们提交一次预校验。
我们将注册的用户名发送给服务器去校验一下,如果已经存在,则返回用户已经注册,否则用户名可以注册。
(我们可以映射一下,服务器返回0就是不可注册,返回1就是用户名可以注册)
创建register.js:
register.js
$(function () {
var $username = $('#username_input');
$username.change(function () {
var username = $username.val().trim();
/* 判断内容框是否为空,空的就不发送给服务器验证 */
if (username.length) {
// 将用户名发送给服务器预校验
$.getJSON('/peiqi1/checkuser/', {'username': username}/*传入参数*/, function (data) {
console.log(data); /* 打印返回的结果 */
})
console.log('hahaha')
}
})
})
register.html导入js:
{% block ext_js %}
{{ block.super }}
<script type="text/javascript" src="{% static 'peiqi1/user/js/register.js' %}"></script>
{% endblock %}
urls:
用来提交给服务器去检查用户名是否可用
url(r'^checkuser/', views.check_user, name='check_user'),
views:
def check_user(request):
# 从前端获取username
username = request.GET.get('username')
# 将数据库所有的username取出来
users = peiqi1user.objects.filter(u_usename=username)
data = {
'status': HTTP_OK,
'msg': 'user can use'
}
if users.exists(): # 判断username是否匹配
data['status'] = HTTP_USER_EXIST
data['msg'] = 'user already exist'
else:
pass
return JsonResponse(data=data)
测试:
可以看到当我们输入完用户名时,鼠标点击其他地方,就会自动提交给服务器去检测用户名,并且返回是否可用
下面我们要将判断的结果返回到web页面中:
resigster.js:
$(function () {
var $username = $('#username_input');
$username.change(function () {
var username = $username.val().trim();
/* 判断内容框是否为空,空的就不发送给服务器验证 */
if (username.length) {
// 将用户名发送给服务器预校验
$.getJSON('/peiqi1/checkuser/', {'username': username}/*传入参数*/, function (data) {
console.log(data); /* 打印返回的结果 */
var $username_info = $('#username_info');
if (data['status']===200){ /*如果状态码位200*/
$username_info.html('用户名可用').css('color', 'green');
}
else if(data['status']===901){ /*如果状态码为901*/
$username_info.html('用户已存在').css('color', 'red');
//预留其他的状态码
}
})
}
})
})
测试:
补充:
单线程模型
单线程模型是按顺序运行代码块,第一块完成之后再去完成第二块,按顺序执行。
多线程模型
一般多用在爬虫中,哪怕是系统的进程中用了多线程,也是服务器的框架自动使用的。
异步/同步模型模型
同步可以这么理解:一个人看电影,先看电影1再看电影2
异步:同时下载3部电影,那一步先下载好,先看哪一部,其他电影继续保持下载状态。
此处评论已关闭