路由层各种功能
路由层各种功能
-
django orm简介
为了不使用sql语句操作数据库 使用类 对象.属性的方式 缺点是:自动写的sql语句可能不是最佳执行效率 使用explain 的type可能会是all 优点是:不用写sql语句
-
使用orm
1.先在settings里配置databases 2.在__init__里面添加 pymysql.install_as_MySQLdb() 3.去应用下models 创建类 等同于创建表 class User(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) 4.执行数据库迁移 python3 manage.py makemigrations python3 manage.py migrate """ 主键字段不写也可以 orm会自动帮你添加上一个名为id的主键 只要修改了models中与数据库相关的代码就需要执行迁移命令 """
-
orm 字段增删改查
# 针对字段(当表中已经有数据的情况下新增字段需要加下列任意一个参数) null=True # 允许为空 default=123 # 默认值
-
orm 记录增删改查
查 models.User.objects.all() #查所有 models.User.objects.filter() # 括号内不加条件就是all ''' 上述两个方法返回的结果是queryset对象 我们可以简单的看成是 列表套数据对象 [数据对象1,数据对象2,数据对象3] ''' 增 models.User.objects.create() # 返回值为当前新增数据对象 user_obj = models.User(...) #相当于类创建个对象,然后修改等等 最后save保存一下 user_obj.save() 改 models.User.objects.filter(id=1).update(...) # 批量改 edit_obj =models.User.objects.filter(id=1).first()#不加first 获取的是列表套数据对象 first等于取索引0 的数据对象 edit_obj.name = 'jasonNB' edit_obj.save() 删 models.User.objects.filter(id=1).delete() # 批量删
-
orm外键的创建
一对多 publish = models.ForeignKey(to='Publish') #建在多的一方创建外键 在实际表中publish会自动加上_id后缀(自己在定义的时候不要加) 多对多 authors = models.ManyToManyField(to='Author') #建在多的一方 不会创建字段 而是会告诉orm创建第三张表存放对应关系 一对一 author_detail = models.OneToOneField(to='AuthorDetail') #建在查询频率较高的表中 自动加_id后缀
- 简易版本django请求生命周期流程图(重要)
- 路由匹配
- 无名有名分组
- 反向解析
- 无名有名解析
- 路由分发
- 名称空间
- 伪静态
- 虚拟环境
-
简易版本django请求生命周期流程图(重要)
-
路由匹配
url(正则表达式,函数或者类型地址) url(r'home',views.home), url(r'homeadd',views.home123), 发现如果浏览器输入http://127.0.0.1:8000/home/ http://127.0.0.1:8000/home123/ 都访问的是home 没有访问home123 原因是因为 正则表达式 ,输入了home123 拿着这个去urls里去比对 发现home可以匹配上 所以立刻停止匹配,执行home url(r'home/',views.home), url(r'homeadd/',views.home123), # 可以匹配到 他自动加了/ jango功能匹配两次 在路由匹配环节如果第一次都没有匹配上django会在路径后面加斜杠再次匹配 APPEND_SLASH = True # True 添加此功能 False 移除此功能 #现在有一个问题 http://127.0.0.1:8000/adsadasd/home/ 也可以匹配到 所以 加上一个^以什么什么开头 url(r'^home/',views.home), url(r'^home123/',views.home123), # 还有个$ 以什么什么结尾 不过一般不加 具体看情况 url(r'^home/$',views.home), url(r'^home123/$',views.home123), # 首页 什么都不带 访问首页 url(r'^$',views.home), #路由匹配的原则:从上往下正则表达式能够匹配到内容就算匹配成功会立刻执行后面的视图函数并且结束整个路由匹配过程
-
无名有名分组
# 无名分组 url(r'^home123/(\d+)/',views.home123), # home123(request,1234) """小括号括起来的正则就是分组 在路由匹配如果将某部分正则使用括号括起来了 那么该部分正则匹配到的内容会当做位置参数传递给后面的视图函数 """ 报错信息:home123() takes 1 positional argument but 2 were given 需要一个参数 却给了两个 views视图修改一下形参 发现接受到的是括号内正则匹配到的内容 # 有名分组 大写的P url(r'^home123/(?P<year>[0-9]{4})',views.home123) # home123(request,year=1234) """在路由匹配如果将某部分正则使用括号括起来了 那么该部分正则匹配到的内容会当做关键字参数传递给后面的视图函数 关键字名字为括号内指定的名字 """ # 能否混用? 不能混用 url(r'^index/(\d+)/(?P<xxx>\d+)/',views.index) # 单个情况下可以重复使用 url(r'^index/(\d+)/(\d+)/(\d+)/',views.index) url(r'^index/(?P<yyy>\d+)/(?P<xxx>\d+)/',views.index)
-
反向解析
1.在路由层书写正则与函数名的时候 在后面加一个唯一标识name名字 url(r'^login/',views.login,name='my_login'), 2.前端反向解析 前端直接调用 <a href="{% url 'my_login' %}">点我1</a> #记得引号 3.后端反向解析 from django.shortcuts import reverse print(reverse('my_login')) """ 通过标记解析出一个结果 该结果可以访问到标记所在的那一行地址 """
-
无名有名解析
# 无名分组的反向解析 url(r'^login/(\d+)/',views.login,name='my_login') 后端 _url = reverse('my_login',args=(111,))#除了指定name 还需要指定一个参数 元组格式的 print(_url) # /login/111/ 前端 {% url 'my_login' 1 %} # 有名分组的反向解析 url(r'^login1/(?P<xxx>\d+)/',views.login1,name='my_login1') 后端 _url = reverse('my_login',kwargs={'xxx':123}) _url = reverse('my_login',args=(123,)) #这样写也ok print(_url) # /login/123/ 前端 {% url 'my_login' xxx=1 %} """其实无名有名反向解析可以使用通用的方式""" 都可以使用无名分组的反向解析
-
路由分发
django项目很大时候,多个app在一起,需要做拆分 """ django支持所有的应用都可以拥有自己的 urls.py templates文件夹 static文件夹 也就意味着多人协同开发变得更加的简单了 """ 总路由 #记得提前导入一个include ip:端口/app01/app01的urls ip:端口/app02/app02的urls url(r'^app01/',include('app01.urls')), url(r'^app02/',include('app02.urls')), #还有一种写法 这个要导入 app01 的urls 和app02 的urls 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 from app01 import views urlpatterns = [ url(r'^index/',views.index) ] 子路由 from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^index/',views.index) ]
-
名称空间
#多个app种出现了相同的别名 使用反向解析无法自动识别 子路由 urlpatterns = [ url(r'^index',views.index ,name='index') ] 子路由 urlpatterns = [ url(r'^index',views.index ,name='index') ] 总路由 需要指定namespace url(r'^app01/',include('app01.urls',namespace='app01')), url(r'^app02/',include('app02.urls',namespace='app02')), 解析时候 reverse('app01:index') reverse('app02:index') """ 名称空间其实也可以不用 只需要确保不同的app下别名不冲突即可 如何不冲突 可以在起别名的时候加上应用名前缀 app01_my_index app02_my_index """
-
伪静态
静态页面 数据写死的 不怎么改变的 伪静态页面 看似是文件其实是动态网页 这么做事为了提高网站被搜索引擎收录的概率 将路径后缀改为.html形式即可
-
虚拟环境
虚拟环境能够实现针对不同的项目配备专属的编程环境
创建虚拟环境相当于重新下载了一个新的解释器
虚拟环境的唯一表示是venv文件夹