url函数的使用(支持正则)
# Django1X中使用的是url
url(r'^test/', views.test),
url函数的第一个参数是支持正则表达式的,如果匹配到了一个路由就不会往下匹配,直接执行到对应的视图层。
Eg:
url('test', views.test),
url('testadd', views.testadd),
# 如果我去访问testadd,那么他还是会执行test的视图层,因为正则的原因它会先匹配到text,然后去执行text的视图层
解决办法就是:使用正则精准匹配
url(r'^test/', views.test),
url(r'^testadd/', views.testadd),
"以....开头"
"/"是哪里来的?
# http://127.0.0.1:8000/test/
是django默认设置的,django会先拿着test去匹配,如果匹配不到,它会自动加一个斜杠再次去匹配
# django2中使用的是path
path('test/', admin.site.urls), # path是不支持正则的,它是精准匹配,输入的内容和路由地址必须是完全不配
re_path('^test/$', admin.site.urls) # django1中的url是完全一样的
1、无名分组
分组:在正则中使用小括号括起来就是分组
url(r'^testadd/(\d+)$', views.testadd),
"""注意:如果使用了分组那么就要在对应的视图层函数内定义一个任意名字的形参,用来接收testadd后面的(\d+)参数,无名分组对形参名字那没有限制要求"""
def testadd(request, xxx):
print(xxx) # http://127.0.0.1:8000/testadd/1333 xxx:1333
return HttpResponse("add:testadd")
"无名分组就是把路由地址匹配到的数据以位置形参的方式传递给视图函数"
2、有名分组
url(r'^testadd/(?P<year>\d+)$', views.testadd),
"如果使用了有名分组的方式,那么你在视图函数中的形参,就必须是你定义的那个名字,其他的跟无名分组没哟区别"
def testadd(request, year):
print(year) # 2231
return HttpResponse("add:testadd")
"""无名分组可以跟有名分组在一起使用,但是最好不要在一起使用"""
# 但是无名或者有名单独的可以使用多次
url('^testadd/(?P<year>\d+)/(?P<month>\d+)/(?P<month>\d+)/(?P<month>\d+)$', views.testadd)
url('^test/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)$', views.test),
# django2中的用法
re_path('^test/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)$', views.test),
re_path('^testadd/(?P<year>\d+)/(?P<month>\d+)/(?P<month>\d+)/(?P<month>\d+)$', views.testadd)
反向解析
反向解析的意思是可以给路由起一个名字,然后通过一个方法解析出来这个名字对应的路由地址
1、# 先给路由起一个别名
url(r'^texts/', views.text,name='ooo'), # name要放在被跳转的url里面
2、# 反向解析
# 前端反向解析
<a href="{% url 'ooo' %}">111</a>
# 后端反向解析
借助于reverse模块
from django.shortcuts import render,HttpResponse,redirect,reverse
def text(request):
return HttpResponse("test")
def home(request):
urls = reverse('ooo') # 这个要放在跳转的页面,而不是被跳转的
return render(request, 'home.html', locals())
"这样无论我们怎么改路由都可以正常访问"
# 无名分组反向解析
1、url(r'^index/(\d+)/',views.index,name='xxx')
# 前端
{% url 'xxx' 123 %}
# 后端
reverse('xxx', args=(1,))
"""
这个数字写代码的时候应该放什么
数字一般情况下放的是数据的主键值 数据的编辑和删除
url(r'^edit/(\d+)/',views.edit,name='xxx')
def edit(request,edit_id):
reverse('xxx',args=(edit_id,))
{%for user_obj in user_queryset%}
<a href="{% url 'xxx' user_obj.id %}">编辑</a>
{%endfor%}
今天每个人都必须完成的作业(*******)
利用无名有名 反向解析 完成数据的增删改查
"""
# 有名分组反向解析
url(r'^func/(?P<year>\d+)/',views.func,name='ooo')
# 前端
<a href="{% url 'ooo' year=123 %}">111</a> 了解
<a href="{% url 'ooo' 123 %}">222</a> 记忆
# 后端
# 有名分组反向解析 写法1 了解
print(reverse('ooo',kwargs={'year':123}))
# 简便的写法 减少你的脑容量消耗 记跟无名一样的操作即可
print(reverse('ooo',args=(111,)))
Django中的path函数支持的5种转换器
路由分发
# 目前一个Django项目只有一个总路由文件
# 但是当我们的路由比较多的时候,这个文件就会产生很多的路由地址,产生的问题就是理由比较臃肿,不太容易管理,也不太容易排查错误
我们针对每一个应用也可以有自己的路由文件,每一个应用下的路由我们称之为是"子理由"
1、先在每个应用下面创建一个路由文件
2、在总路由中导入:
from django.conf.urls import url, include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url('^app_one/', include('app_one.urls')),
url('^app_two/', include('app_two.urls'))
]
http://127.0.0.1:8000/app_one/testadd/123
协议//网址//端口//当前路由所在的应用名称/路由/其它参数
"""这时候产生了很多的路由文件,匹配的时候先匹配总路由,然后由总路由分发到每个子路由"""
# 这时候的总路由任务就是分发,而执行到具体视图函数交给每个子路由
方式二:
from app_one import urls as app_one_urls
from app_two import urls as app_two_urls
url('^app_one/', include(app_one_urls)),
url('^app_two/', include(app_two_urls))
"""
总路由中的路由分发地址后面一定不能加$
"""
"""
当你分发完路由以后,再次到浏览器访问的时候需要加上你的总路由分发的后缀
"""
总路由:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app_one/', include('app_one.urls_one')),
url(r'^app_two/', include('app_two.urls_two')),
]
app_two的路由:
urlpatterns = [
# url(r'^register/', views.register),
# url(r'^test_k/', views.test, name='ooo'),
# url(r'^register/', views.Index.as_view()),
url(r'^register/', views.index),
# url(r'^register/,views.vies')
]
访问方式:
http://127.0.0.1:8000/app_two/register/
一定要加上app_two的后缀,要不然访问会不成功
伪静态概念
静态文件.html
我们的文件:
http://127.0.0.1:8000/app01/index
搜索的文件:
https://www.cnblogs.com/fanshaoO/p/17592993.html # 其实就是伪静态之后的地址
这个地址是动态的地址,数据是从数据库中查询出来的,而不是在页面中写死的
伪静态的作用是什么呢:
"""
作用就是让搜索引擎增大seo的查询力度,言外之意就是让我们的页面能够更加容易的被搜索引擎搜索出来
"""
# 因为静态的页面更加容易被搜索引擎抓到,这个称之为是seo
# seo就是优化你们的产品能够被更容易的搜多到
SEO---------------------->一般是通过技术手段等实现
SEM---------------------->它是需要收费的,其实就是广告
虚拟环境(纯净版的解释器)
# 每开发一个项目我就下载一个解释器,当然能够解决问题,你想这样做吗?
我们会使用虚拟环境来解决这个问题
虚拟环境其实就是一个纯净版本的解释器,你不用每次都下载和安装
# 它就是一个文件夹形式存在的解释器
# 虚拟环境尽量不要创建,创建出来够你的项目使用就行了
# 虚拟环境还可以通过命令创建