内容概要
- django写登录注册功能
- django生命周期流程图
- 路由层相关知识
- 路由匹配
- 无名分组
- 有名分组
- 反向解析
- 名称空间
- 路由分发
django写登录注册功能
| 1.使用自带的sqlite3数据库 |
| 第一次使用pycharm链接sqlite3也需要先下载驱动 |
| 2.编写注册、登录功能 |
| '''静态文件无法拖拽到pycharm文件栏:C盘不支持 采用cv操作''' |
| 前期提交post请求初选403 需要配置文件注释一行 |
| MIDDLEWARE = [ |
| 'django.middleware.csrf.CsrfViewMiddleware', |
| ] |
| |
| |
| urlpatterns = [ |
| |
| url(r'^reg/', views.reg), |
| |
| url(r'^login/', views.login) |
| ] |
| |
| |
| |
| def reg(request): |
| if request.method == 'POST': |
| username = request.POST.get('username') |
| password = request.POST.get('password') |
| confirm_pwd = request.POST.get('confirm_password') |
| |
| if not password == confirm_pwd: |
| return HttpResponse('两次密码不一致') |
| |
| is_user = models.UserInfo.objects.filter(name=username) |
| if is_user: |
| return HttpResponse('当前用户已存在') |
| |
| models.UserInfo.objects.create(name=username, pwd=password) |
| |
| |
| 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() |
| |
| if not is_user: |
| return HttpResponse('用户名不存在') |
| if str(is_user.pwd) == password: |
| return HttpResponse("登录成功") |
| return HttpResponse('密码错误') |
| return render(request, 'login.html') |
| |
django生命周期流程图
整体概括请求的走向以及django的核心组成部分

路由层
路由匹配
| 路由匹配的特点是 只要匹配上了就会立刻结束执行对应的视图层中的函数 |
| 并且url方法的第一个参数是一个正则表达式 |
| 只要正则表达式能够从用户输入的后缀中 匹配到内容就能匹配上了 |
| eg: |
| 正则是test 内容是test 那么可以匹配出test文本 |
| 正则是test 内容是testadd 那么还可以匹配出test文本 |
| 都算匹配上了!!! |
| |
| |
| 正则式test/ 内容test 那么首次无法匹配 |
| |
| 首次匹配不上 那么django还会让浏览器默认加斜杠再次发送请求 检查NetWork |
| test 301 |
| test/ 200 |
| ''' |
| 了解:斜杠机制可以取消 但是不推荐 |
| 找到settings.py 添加>> |
| APPEND_SLASH = False |
| ''' |
| |
| 正则是test/ 内容是abcdefgtest/ 那么可以匹配出文本test/ |
| 可以在正则的最前面加上上箭头来限制 |
| '''解决路由前面可以随意乱写的问题''' |
| |
| 正则是^test/ 内容是test/abc/edf/acd/ 那么可以匹配出文本test/ |
| 可以在正则的最后面加上$来限制 |
| '''解决路由后面可以随意乱写的问题''' |
| |
| |
| 小扩展: |
| 可以定制一个主页面 用户不携带后缀可以直接访问(掌握) |
| url(r'^$',views.home) |
| 也可以定义一个尾页 用户输入一个没有对应关系的直接返回(了解) |
| url(r'.*',views.error) |

有名无名分组
| |
| url(r'^test/([0-9]{4})/$', views.test) |
| """ |
| 路由匹配成功之后就会调用视图函数默认情况下会自动给视图传递一个request 位置参数 |
| 如果路由匹配中使用括号对正则表达式进行了分组 那么在调用views视图函数的时候 |
| test(request) |
| 报错: test() takes 1 positional argument but 2 were given |
| 会将括号内匹配到的内容当做位置参数传递给视图函数 |
| test(request,括号内正则表达式匹配到的内容) |
| 用变量接收 |
| """ |
| |
| |
| url(r'^testadd/(?P<user_id>[0-9]{4})$', views.testadd) |
| """ |
| 给括号内的正则表达式起别名之后 匹配成功则会讲括号内匹配到的内容按照 关键字参数 传递给视图函数 |
| testadd(request,user_id=括号内正则表达式匹配到的内容) |
| |
| """ |
| |
| |
| url(r'^test/(\d+)/(?P<user_id>[0-9]{4})/$', views.testadd) |
| 无名有名分组不能混合使用!!! 单个可以重复使用 |
| url(r'^test/(\d+)/(\d+)/$', views.testadd) |
| url(r'^test/(?P<a>\d+)/(?P<b>\d+)',views.testadd) |

反向解析
| """ |
| a标签的href可以写网址的全称 也可以写后缀 |
| href='https://www.baidu.com' |
| href='/login/' # 自动补全当前服务的ip和port |
| href='127.0.0.1:8000/login/' |
| """ |
| 1.页面上有很多a标签链接了其他路由 |
| 2.路由匹配表达式出现了变化 html页面上的地址全部失效 |
| |
| |
| 通过反向解析可以获取到一个结果 该结果可以访问到一个路由 |
| 步骤1: 给对应的路由起别名 |
| url(r'^func666/',views.func,name='func_view') |
| 步骤2: 使用方向解析获取结果 |
| 前端: |
| {% url 'func_view' %} |
| 后端: |
| from django.shortcuts import reverse |
| reverse('func_view') |
| |
| 步骤1: |
| 给对应关系起别名 |
| url(r'^func666/(\d+)/',views.func,name='func_view') |
| 步骤2:使用反向解析获取结果 |
| '''无法明确括号内正则表达式的内容 需要人为指定''' |
| 前端: |
| {% url 'func_view' 123 %} |
| 后端: |
| from django.shortcuts import reverse |
| reverse('func_view',args=(666,)) |
| |
| |
| 步骤1:给对应关系起别名 |
| url(r'^func666/(?P<id>\d+)/',views.func,name='func_view') |
| 步骤2:使用反向解析获取结果 |
| '''无法明确括号内正则表达式的内容 需要人为指定''' |
| 前端: |
| {% url 'func_view' 123 %} |
| {% url 'func_view' id=123 %} |
| 后端: |
| from django.shortcuts import reverse |
| reverse('func_view',args=(666,)) |
| reverse('func_view',kwargs={'id':1}) |
| |
| """ |
| 疑问:无名有名反向解析中的手动传值 这个值在实际工作中到底可以是什么 |
| 一般情况下这个值可以是数据的主键值、页面的页码、区域的编号等 |
| """ |



路由分发
| """ |
| 如果一个django项目特别庞大 里面有很多应用 每个应用下有很多对应关系 |
| 那么django自带的路由层里面的代码就会非常非常的多 如何优化??? |
| 根据应用的不同拆分到不同的应用中 |
| |
| django支持每个应用都可以有自己独立的 |
| 路由层、模板层、静态文件、视图层(默认)、模型层(默认) |
| |
| 上述特性能够让django在分组开发上更加的方便、快捷 |
| 所有人都可以在应用中开发完整的项目功能 |
| 最后汇总到一个空的django项目中 然后通过路由分发整合所有人的应用 |
| """ |
| |
| Tools>>>Run manage.py Task |
| 弹出窗口输入: startapp 应用名(app02) |
| |
| 1.创建多个应用 并去配置文件中注册 |
| INSTALLED_APPS = [ |
| 'app01', |
| 'app02' |
| ] |
| 2.在多个应用中编写相同的路由 |
| |
| urlpatterns = [ |
| url(r'^index/',views.index111) |
| ] |
| app02下的路由层urls.py |
| urlpatterns = [ |
| url(r'^index/',views.index) |
| ] |
| 3.路由分发 |
| |
| from django.conf.urls import url, 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')) |

名称空间
| 1.不同的应用使用了相同的别名 那么反向解析是否自动识别 |
| index_view app01/index/ |
| index_view app02/index/ |
| 2.验证发现默认情况下是不会自动识别应用前缀的 如何解决反向解析问题 |
| 方式1:名称空间 |
| 总路由添加名称空间 |
| 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' %} |
| 方式2:只需要确保反向解析的别名在整个项目中不重复即可!!! |
| 可以在别名的前面加上应用名的前缀 |
| url(r'^index/',views.index,name='app01_index_view') |
| url(r'^index/',views.index,name='app02_index_view') |
| """ |
| 名称空间其实是可有可无的知识 但是在实际工作中还是有不少程序员喜欢使用 |
| """ |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)