django登录注册作业讲解 django请求生命周期流程图 路由层之路由匹配 无名有名分组 反向解析 路由分发 名称空间
day52
作业讲解
1.使用自带的sqlite3数据库
第一次使用pycharm链接sqlite3也需要先下载驱动
2.编写注册、登录功能
'''静态文件无法拖拽到pycharm文件栏:C盘不支持 采用cv操作'''
前期提交post请求初选403 需要配置文件注释一行
def reg(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
confirm_pwd = request.POST.get('confirm_password')
# 1.先判断两次密码是否一致
if not password == confirm_pwd:
return HttpResponse('两次密码不一致')
# 2.判断用户名是否已存在
is_user = models.UserInfo.objects.filter(name=username)
if is_user:
return HttpResponse('当前用户已存在')
# 3.写入数据库
models.UserInfo.objects.create(name=username, pwd=password)
# return HttpResponse(f'{username}注册成功')
# 4.直接跳转到登录页面:后面还可以实现 注册之后自动登录
return redirect('/login/')
return render(request, 'reg.html')
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
is_user = models.UserInfo.objects.filter(name=username).first()
# filter结果是列表套对象
if not is_user:
return HttpResponse('用户名不存在')
if str(is_user.pwd) == password: # 获取到的用户输入是字符串 数据库字段是整型
return HttpResponse("登录成功")
return HttpResponse('密码错误')
return render(request, 'login.html')

# django二次追加斜杠机制
假设:
正则是test/ 后缀内容是test 那么首次无法匹配 会报错 301
由于django二次追加斜杠机制 首次匹配不上 django还会让浏览器默认加斜杠再次发送请求 能正常匹配到了
eg:
test 301
test/ 200
# 斜杠机制也是可以取消的 但是不推荐
在settings.py文件中编写以下代码
APPEND_SLASH = False
# 解决路由前面可以随意乱写的问题
在正则的最前面加上 ^来限制 比如 ^test/
eg:
正则是test 后缀内容是asdfghtest/ 也可以匹配处文本test/
# 解决路由后面可以随意乱写的问题
在正则的最后面加上$来限制
eg:
正则是^test/ 后缀内容是test/asd/dfg/asd/ 也可以匹配出文本test/
注意:由于第一个参数是正则 如果遇到大项目 对应关系特别多的时候要注意可能会出现路由顶替的现象
# 定制一个主页面 让用户不携带后缀可以直接访问
在url.py中编写
url(r'^$', views.home)
在views.py中编写
def home(request):
return HttpResponse("欢迎来到xx网首页")
# 也可以定义一个尾页 用户输入一个没有对应关系的直接返回(了解)
url(r'.*',views.error)
url(r'^test/[0-9]{4}/$', views.test)
路由匹配成功之后就会调用视图函数 默认情况下会自动给视图函数传递一个request位置参数
test(request)
如果路由匹配中使用括号对正则表达式进行了分组 :
url)r'^test/([0-9]{4})/$',views.test)
那么在调用视图函数的时候会将括号内的匹配到的内容当作位置参数传递给视图函数
test(request, 括号内正则表达式匹配到的内容)
这种特性在django中被称之为 '无名分组'
在括号内的正则表达式起别名后 匹配成功后会将括号内匹配到的内容按照关键字参数传递给视图函数
testadd(request, user_id=括号内正则表达式匹配到的内容)
上述特性django称之为'有名分组'
# 无名分组和有名分组不能混合使用 单个可以重复使用
url(r'^test/(\d+)/(?<user_id>[0-9]{4}/$)', views.testadd) # 不可以混合使用
url(r'^test/(\d+)/(\d+)/$', views.testadd) # 多个无名分组可以一起使用
url(r'^test/(?P<a>\d+)/(?<b>\d+)', views.testadd) # 多个有名分组可以一起使用
href='/login/' # 如果是自己的网站 写后缀即可 他会自动补全当前服务的ip和port
可以看作是href='127.0.0.1:8000/login/'
# 如果修改了路由表达式
假设html中的a标签链接了其他路由
一旦路由匹配表达式出现了变化
html页面上的地址会全部失效
# 反向解析的定义
通过反向解析可以获取到一个结果 该结果可以访问到一个路由
# 使用反向解析
步骤一:给对应关系起别名 name='func_view' 这个name可以看作这组对应关系唯一的查找方式
url(r'^func666/', views.func, name='func_view')
步骤二: 使用反向解析获取结果 可以用在前端和后端
前端:
<a href="{% url 'func_view' %}">func_view</a> # func666/ 结果可以访问路由
后端:
需要先在views.py中导一个模块
from django.shortcuts import reverse
reverse('func_view') # func666/ 结果可以访问路由
# 无名分组反向解析
步骤一:给对应关系起别名
url(r'^func666/(/d+)/', views.func, name='func_view')
步骤二:使用反向解析获取结果
由于无法明确括号内正则表达式的内容 会出现报错 需要人为指定
前端:
<a href="{% url 'func_view' 123 %}">func_view</a> # func666/123/
后端:
需要先在views.py中导一个模块
from django.shortcuts import reverse
reverse('func_view', args=(666,)) # func666/666
# 有名分组反向解析
步骤一:给对应关系起别名
url(r'^func666/(?P<id>\d+)/', views.func, name='func_view')
步骤二:使用反向解析获取结果
同样 无法明确括号内正则表达式的内容 需要人为制定
前端:以下两种方式都可
{% url 'func_view' 123 %} # func666/123/
{% url 'func_view' id=123 %} # func666/123/
后端:以下两种方式都可
rom django.shortcuts import reverse
reverse('func_view',args=(666,)) # func666/666/
reverse('func_view',kwargs={'id':1}) # func666/1/
# 无名有名分组反向解析中的手动传值
一般情况下这个值可以是数据的主键值、页码的页码、区域的编号等
3.路由分发
在总路由中
from django.conf.urls import url, include # 导入include
from app01 import urls as app01_urls # 取别名
from app02 import urls as app02_urls
# 总路由结尾不能加$ 否则无法分发
url(r'^app01/',include(app01_urls)), url(r'^app02/',include(app02_urls))
总路由只负责分发 不负责视图函数对应
总路由以后只会根据路径前面的前缀来帮你分发到子路由中去 路径后面的后缀由子路由再做详细比对
上述代码还可以简写
from django.conf.urls import url, include
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
# 如果多个应用下业务逻辑代码很多 导致views.py内代码繁重
可以将views.py移除 换成views文件夹
然后再该文件夹内根据业务逻辑的不同拆分成不同的py文件
views文件夹
user.py
account.py
backend.py
浙公网安备 33010602011771号