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请求生命周期流程图

 

路由层之路由匹配

# 路由匹配的特点

  因为url方法的第一个参数是一个正则表达式

  一旦从用户输入的后缀中匹配到了就会立刻结束 并执行对应的视图函数

eg:

  正则是test  后缀内容是test  那么可以匹配test文本

  正则是test  后缀内容是testadd  那么还可以匹配test文本

 

# 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中被称之为 '无名分组'

 

 

有名分组

假设:

url(r'^testadd/(?P<useri_id>[0-9]{4})$',views.testadd)

在括号内的正则表达式起别名后  匹配成功后会将括号内匹配到的内容按照关键字参数传递给视图函数

  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)  # 多个有名分组可以一起使用

 

反向解析

# a标签中的href

  可以写网址的全称 也可以写后缀

  href='http://www.baidu.com' 

 

  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/

# 无名有名分组反向解析中的手动传值

  一般情况下这个值可以是数据的主键值、页码的页码、区域的编号

 

路由分发

  django为了更好的协同开发  

  支持每个应用都可以有自己独立的

  路由层、模版层、静态文件、视图层(默认)、模型层(默认)

 

上述特性能够让django在分组开发上更加的方便、快捷

所有人都可以在应用中开发完整的的项目功能 最后汇总到一个空的django项目中 然后通过路由分发整合所有人的应用

 

1. 创建多个应用 并去配置文件中注册

  Tools >>> startapp app02

  settings>>> INSTALLED_APPS=['app02']

 

2. 在多个应用中编写相同的路由

  app01和app02下创建urls.py 将总路由的框架照搬到子路由

  在app01和app02中写路由和视图对应关系

  urlpatterns = [
    url(r'^index/',views.index111)
]
    urlpatterns = [
    url(r'^index/',views.index)
]

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

名称空间

  整个项目中出现名字重复 则需要使用名称空间

假设:

  如果app01和app02都使用了相同的别名 name='index_view'

  反向解析的时候是否会自动拼接前缀 ??

结论:

  默认情况下不会自动识别应用前缀  

通过两种方式解决

方式一:总路由添加名称空间

添加名称空间参数 namespace=' '  

url(r'^app01/',include('app01.urls',namespace='app01')),
 url(r'^app02/',include('app02.urls',namespace='app02'))

应用反向解析时自动提示 让你选择

后端
reverse('app01:index_view')
reverse('app02:index_view')

前端
{% url 'app01:index_view' %}
{% url 'app02:index_view' %}

 

方式二: 只需要确保反向解析的别名在整个项目中不重复即可!!!

          可以在别名的前面加上应用名的前缀  不用使用名称空间参数 在应用下添加别名name='app01_index_view'

    url(r'^index/',views.index,name='app01_index_view')
    url(r'^index/',views.index,name='app02_index_view')

 

        

 

      

 

posted @ 2022-05-15 18:44  ji哩咕噜  阅读(86)  评论(0)    收藏  举报