今日的内容:

  1. a. 路由系统
  2. 1. 创建app
  3. 2. 路由的分组
  4. 3. 路由的分发
  5. - 正则表达式匹配
  6. b. djangoorm(模型model
  7. 1. 创建模型的步骤
  8. 2. orm基本的增删改查
  9. 3. 正向查询和反向查询

注意事项:

  1. 1. 前台传给后台一个列表时,后端如何接受:
  2. request.POST.getlist(字段名)
  3. 2. 前台传给后台一个列表时,需要在ajax请求中增加一个参数:
  4. traditional: true
  5. 3. 多选框设置选中状态时,可以使用
  6. $("select的选择器").val(列表)
  7. 4. cookie的参数设置
  8. obj = render(request,'a.html')
  9. obj.set_cookie(key,values,max_age,expires,path,
  10. domain,secure,httponly)
  11. 参数详解
  12. """
  13. key, 键
  14. value=, 值
  15. max_age=None, 超时时间
  16. expires=None, 指定过期时间IE 专用 date = datetime.datetime() expires=date
  17. path='/', cookie有效路径
  18. domain=None, Cookie生效的域名
  19. secure=False, https传输
  20. httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
  21. """
  22. 5. 删除Cookie
  23. def logout(request):
  24. rep = redirect("/login/")
  25. rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
  26. return rep
  27. 6. 获取Cookie
  28. username = request.COOKIES.get('username') # 取出登录用户名
  29. 7. cookie的加盐
  30. #通过加盐的方式为cookie签名。
  31. obj.set_signed_cookie('kkk','vvv', salt='123456')
  32. #获取经过签名后的cookie值。
  33. request.get_signed_cookie('kkk', salt='123456')
  1. # 目录结构
  2. migrations # 模型操作的迁移文件
  3. init
  4. admin # 管理文件,django admin的时候会用到
  5. apps # 应用信息定义文件,在其中生成了类AppCongfig,该类用于定义应用名等Meta数据
  6. models # 添加模块层数据类的文件,orm框架时使用
  7. tests # 测试代码文件
  8. views # 视图文件

路由分组

对多个视图进行一个分组,比如class为一个组,所有跟class相关的增,删,改,查视图都放在这个app中。各司其职,互不干扰。相比之前把所有的代码写到urls中,功能分划更清晰。

创建app的两种方式:

1. 使用pycharm创建django项目时,可以创建。缺点:只能创建一个
2. 命令行创建python3 manage.py startapp app名称(可创建多个),
  • django使用的什么版本的解释器,就需要用对应的解释器创建app
  • 需要在对应的目录下创建

分组:

第一种方式

a. 项目下的urls.py中

  1. from *** import views
  2. urlpatterns = [
  3. url(r'^test/', views.test),
  4. ]
  5. # 缺点,只能导入一个app,多个app会导致名称空间被污染
第二种方式
  1. django项目下的urls.py文件,注意:需要导入include模块
  1. from django.conf.urls import url,include
  2. urlpatterns = [
  3. url(r'^classes/',inclued("classes.urls")),
  4. url(r'^student/',inclued("student.urls")),
  5. url(r'^teacher/',inclued("teacher.urls"))
  6. ]
  1. 在对应的app下,创建一个urls.py文件

  2. 对应app的urls.py

  1. form django.conf.urls import url
  2. from classes import views
  3. urlpatterns = [
  4. url(r'^get_classes/',views.get_classes),
  5. ]
  1. 对应app下的views.py文件内容为:
  1. from django.shortcuts import render,HttpResponse
  2. # Create your views here.
  3. def get_classes(request):
  4. return HttpResponse("get_classes")

第二种方式的总结:

  • 客户端访问127.0.0.1:8000/classes/get_classes时,先进入到项目下的urls.py文件进行匹配
  • 根据项目下urls.py中的对应关系,进入到各个app项目下的urls.py文件中进行匹配
  • 根据各个app下的urls.py中的对应关系,匹配成功请求路径后,执行对应app项目下views.py文件下的函数。

路由分发

  1. from app01 import views
  2. urlpatterns = [
  3. url(r'^test/(?P<id>\w+)/(?P<name>\w+)', views.test),
  4. ]
  5. # app01项目下views.py文件:
  6. def test(request,name,id):
  7. print(name)
  8. print(id)
  9. return HttpResponse("test")
  10. # 浏览器访问
  11. http://127.0.0.1:8000/test/0123/plf
  12. # -------------------------views.py中打印结果---------------------
  13. plf
  14. 0123

当浏览器中输入一个不存在的地址时,我们可以在浏览器中匹配对应的路径,然后为不存在的url,专门设置一个页面

  1. from app01 import views
  2. urlpatterns = [
  3. url(r'^', views.notfound),
  4. ]
反向路由

当一个路径很长的时候,我们可以在路由系统中,设置一个变量a,用来代替这个路径,之后我们在form表单中action中写入{% url "a" %}即可.

  1. # 路由系统中的写法
  2. urlpatterns = [
  3. url(r'^logindbsjhalbdhaskbhdkjsabhdkbashkdbhsabdhsja/$', views.login, name='test'),
  4. ]
  5. # 对应的html的页面中写法:
  6. <form action="/test/" method="post">
  7. <input type="text">
  8. </form>

django中请求处理方式有2种:FBV 和 CBV

第一种:FBV(function base views)

就是在视图里使用函数处理请求

urls.py
  1. from django.conf.urls import url, include
  2. # from django.contrib import admin
  3. from mytest import views
  4. urlpatterns = [
  5. # url(r'^admin/', admin.site.urls),
  6. url(r'^index/', views.index),
views.py
  1. from django.shortcuts import render
  2. def index(req):
  3. if req.method == 'POST':
  4. print('method is :' + req.method)
  5. elif req.method == 'GET':
  6. print('method is :' + req.method)
  7. return render(req, 'index.html')

第二种:CBV(class base views)

就是在视图里使用类处理请求。

urls.py
  1. from mytest import views
  2. urlpatterns = [
  3. # url(r‘^index/‘, views.index),
  4. url(r‘^index/‘, views.Index.as_view()),
  5. ]
  6. # 注:url(r‘^index/‘, views.Index.as_view()), 是固定用法。
views.py
  1. from django.views import View
  2. class Index(View):
  3. def get(self, req):
  4. print('method is :' + req.method)
  5. return render(req, 'index.html')
  6. def post(self, req):
  7. print('method is :' + req.method)
  8. return render(req, 'index.html')
  9. # 注:类要继承 View ,类中函数名必须小写。
  10. '''
  11. 'get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'
  12. form 只支持 post和 get
  13. ajax 支持 所有的方法
  14. '''

ORM框架

1. 先配置mysql的连接地址

  1. # 在settings.py文件中,写入自己需要连接的数据库
  2. DATABASES = {
  3. # 'default': {
  4. # 'ENGINE': 'django.db.backends.sqlite3',
  5. # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  6. # }
  7. 'default': {
  8. 'ENGINE': 'django.db.backends.mysql',
  9. 'NAME':'orm',
  10. 'USER': 'root',
  11. 'PASSWORD': '123456',
  12. 'HOST': '192.168.81.161',
  13. 'PORT': '3306',
  14. }
  15. }

2. 在app中的__init__.py文件中导入pymysql模块

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

3. 在app项目下models.py文件中创建表.一个类一个表

  1. # 类需要继承models.Model
  2. from django.db import models
  3. # Create your models here.
  4. class UserInfo(models.Model):
  5. id = models.AutoField(primary_key=True)
  6. name = models.CharField(max_length=32)
  7. age = models.CharField(max_length=32)
  8. ut = models.ForeignKey("UserType",null=True)

4. 修改配置文件

​ 把我们的应用添加到对应的settings.py的INSTALLED_APPS 中:

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. '****', #我们创建的应用
  9. ]

4. 创建表

  1. python manage.py makemigrations ## 生成迁移文件
  2. python manage.py migrate ## 生成实际的表
  3. ps: 如果修改了models.py中的代码,需要重新执行上面的两行代码

5. 基本操作

  1. 第一种方式
  2. models.users.objects.create(username='xsmile',password=12345)
  3. 第二种方式
  4. a = {'username':"plf",'passsword':'123456'}
  5. models.users.objects.create(**a)
  6. 第三种方式:插入多条数据
  7. info = [
  8. models.UserInfo(name="root1",age=34,ut_id=1),
  9. models.UserInfo(name="root2",age=34,ut_id=2),
  10. models.UserInfo(name="root3",age=34,ut_id=3),
  11. models.UserInfo(name="root4",age=34,ut_id=4),
  12. models.UserInfo(name="root5",age=34,ut_id=5),
  13. models.UserInfo(name="root6",age=34,ut_id=6),
  14. models.UserInfo(name="root7",age=34,ut_id=7),
  15. ]
  16. models.UserInfo.objects.bulk_create(info)
删除
  1. Test.objects.filter(name__contains='jack').delete()

  1. Test.objects.filter(name__contains='apollo1').update(name='Jack')

单表查询


  1. models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
  2. models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
  3. models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
  4. models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的
  5. models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
  6. models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and
  7. 类似的还有:startswithistartswith, endswith, iendswith 
  8. date字段还可以:
  9. models.Class.objects.filter(first_day__year=2017)

多表查询(外键查询)

  1. 1. 正向查询(通过关联的字段ut,直接使用点语法获取另外一张表的字段数据)
  2. objs = models.UserInfo.objects.filter(ut_id__gt=2,ut__title="正常员工")
  3. print(objs)
  4. for i in objs:
  5. print(f"id:{i.id} {i.name} {i.age} {i.ut.title}")

正向查询

第一种:按对象查找

语法

对象.关联字段.字段

  1. book_obj = models.Book.objects.first() # 第一本书对象
  2. print(book_obj.publisher) # 得到这本书关联的出版社对象
  3. print(book_obj.publisher.name) # 得到出版社对象的名称

第二种:按照字段查找

语法

关联字段__字段

  1. print(models.Book.objects.values_list("publisher__name"))

反向查询

第一种:按照对象查找

语法

对象.表名_set

  1. publisher_obj = models.Publisher.objects.first() # 找到第一个出版社对象
  2. books = publisher_obj.book_set.all() # 找到第一个出版社出版的所有书
  3. titles = books.values_list("title") # 找到第一个出版社出版的所有书的书名

第二种:按照字段查找

语法

表名__字段

  1. titles = models.Publisher.objects.values_list("book__title")

django之路由分组,路由分发,FBV,CBV,ORM框架的更多相关文章

  1. 【Gin-API系列】实现路由分组(七)

    在之前的文章介绍中我们已经完成了一个API服务的全链路请求设计.调用方式可以看Test目录的代码 // src/test/request_test.go func TestAPI_Request(t ...

  2. Django 路由视图FBV/CBV

    路由层  url路由层结构 from django.conf.urls import url from django.contrib import admin from app01 import vi ...

  3. Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数

    一.FBV和CBV 在Python菜鸟之路:Django 路由.模板.Model(ORM)一节中,已经介绍了几种路由的写法及对应关系,那种写法可以称之为FBV: function base view ...

  4. django之路由分组,反向解析,有名,无名分组

    路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态的概念 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test',vi ...

  5. Django路由系统---django重点之url映射分发

    django重点之url映射分发 在全局项目的urls.py中进行子项目的映射,然后在子项目中创建一个urls.py去处理自己项目中的请求,同时也实现了代码的解耦 添加路由分发的原则[全局urls.p ...

  6. Django路由配置之子路由include(URL分发)

    子路由include(URL分发) 在一个项目中可能存在多个应用,为了方便区分和管理,在项目的总路由urls.py中会进行路由分发: (1)项目总路由导入from  django.conf.urls  ...

  7. Django基础三之路由、视图、模板

    Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...

  8. Django学习---路由url,视图,模板,orm操作

    Django请求周期 url ->  路由系统  ->函数或者类 -> 返回字符串 或者 模板语言 Form表单提交: 点击提交 -> 进入url系统  ->  执行函数 ...

  9. Django FBV/CBV、中间件、GIT使用

    s5day82 内容回顾: 1. Http请求本质 Django程序:socket服务端 a. 服务端监听IP和端口 c. 接受请求 \r\n\r\n:请求头和请求体 \r\n & reque ...

随机推荐

  1. AcWing 845. 八数码

    https://www.acwing.com/problem/content/847/ #include<bits/stdc++.h> using namespace std; int b ...

  2. 1060 Are They Equal (25分)

    1060 Are They Equal (25分) 题目 思路 定义结构体 struct fraction{ string f; int index; } 把输入的两个数先都转换为科学计数法,统一标准 ...

  3. 题解【洛谷P5483】[JLOI2011]小A的烦恼

    我们可以灵活运用\(C++\)的语法来解决此题. 解释一下代码中会出现的语法: \(string::iterator\ it\)表示定义了一个\(string\)类型的迭代器\(it\),\(^*it ...

  4. apache 二级域名设置

    1. 你要拥有一个有泛域名解析的顶级域名,例如:test.com 在dns服务上设置,域名服务商都提供此服务 www.test.com      指向服务器IPtest.com          指向 ...

  5. 解决linux 中文乱码

    解决办法是在文件/etc/profile末尾添加一行 echo 'export LC_ALL="en_US.UTF-8"' >> /etc/profile source ...

  6. python 序列 倒着取元素

    当要倒着取元素时,用s[-2]只能取一个, 如果取多个时用s[-9:-1],注意,最后一个-1是不取出来的. 此时要用s[-9:] 最后一个空着就可以取出来了.

  7. iview渲染函数

    <Table border :columns="discountColumns" :data="discountData.rows"></Ta ...

  8. Flask 教程 第十五章:优化应用结构

    本文翻译自The Flask Mega-Tutorial Part XV: A Better Application Structure 这是Flask Mega-Tutorial系列的第十五部分,我 ...

  9. [Vue源码]一起来学Vue双向绑定原理-数据劫持和发布订阅

    有一段时间没有更新技术博文了,因为这段时间埋下头来看Vue源码了.本文我们一起通过学习双向绑定原理来分析Vue源码.预计接下来会围绕Vue源码来整理一些文章,如下. 一起来学Vue双向绑定原理-数据劫 ...

  10. 深度学习之tensorflow框架(上)

    import tensorflow as tf import os os.environ[' def tensorflow_demo(): #原生python加法运算 a = 2; b=3; c=a+ ...