上周内容回顾
- 什么是ORM
# 1.对象映射关系类 》表对象 》记录属性 》字段值# 2.如何来使用class User(models.Model):# id int primary key auto_incrementid = models.AutoField(primary_key=True) # 如果表的主键名就是ID 则可以省略username = models.CharField(max_length=32, default=0, null-True) # not null# 3.数据的增删改查# 增# request.POST => {\'A\':1, \'B\':2, \'C\':3}models.User.objects.create(username=\'ly\', password=123)models.User.objects.create(**A)obj = models.User(username=123)obj.save()# 改models.User.objects.filter().update(username=123)obj = models.User.objects.filter(pk=1).first() # 对象,不是querysetobj.username = \'aaa\'obj.password = \'bbb\'obj.save()# 删filter().delete()# 查# filter里面的条件是and关系obj = models.User.objects.filter()obj = models.User.objects.filter().filter().all() # 返回的结果是queryset对象"""因为 返回结果是queryset 就可以继续使用queryset提供的点方法"""# 4.ORM创建外键关系01 一对一关系 外键字段建在使用频率高的一方models.OneToOneField(to=\'AuthorDetail\', to_field=\'\')02 一对多 外键字段建在多的一方models.ForeignKey(to=\'\')03 多对多 外键建在第三张表 不需要我们手动创建authors = models.ManyToManyField(to=\'\')
今日内容概要
- Django 的请求生命周期流程图
- 路由层无名有名分组
- 反向代理
内容详细
1. Django的请求生周期流程图
# 帮助我们梳理django框架的执行顺序
2. 路由层
# 路由匹配 urls.py中# 在Django1.x中 创建新的项目后 先在配置文件settings中修改配置 再去启动项目:"""TEMPLATES = [{\'DIRS\': [os.path.join(BASE_DIR, \'templates\')]"""# url属性中是正则匹配 匹配规则:从上到下只要正则表达式匹配成功,就不会往下匹配了# 在urls.py文件中写入:"""from app01 import viewsurlpatterns = [url(r\'^admin/\', admin.site.urls),url(r\'^$\', views.test), # 客户输入默认域名 就是访问首页url(r\'^test/$\', views.test),url(r\'^testadd/$\', views.testadd),]"""# 在app目录下的views.py文件中写入:"""from django.shortcuts import render, HttpResponse# Create your views here.def test(request):print(\'test\')return HttpResponse(\'test\')def testadd(request):print(\'testadd\')return HttpResponse(\'testadd\')"""# 补充对于Django自动补全/功能 如果不想要 也可以在settings.py文件中增加配置项:APPEND_SLASH = False # 控制django是否自动加斜杠匹配get请求的传参方式:http://127.0.0.1:8000/test/?a=1http://127.0.0.1:8000/test/1
3. 无名分组和有名分组
# 无名分组# 在urls.py文件中写入:# 无名分组url(r\'^test/(\\d+)\', views.test), # 会把括号中匹配的数字当成 位置参数传给视图函数# 在app目录下的views.py文件中写入:"""from django.shortcuts import render, HttpResponse# Create your views here.def test(request, aaa):print(aaa)print(\'test\')return HttpResponse(\'test\')"""# 有名分组# 在urls.py文件中写入:# 有名分组url(r\'^test/(?P<bbb>\\d+)$\', views.test), # 会把括号中匹配的数字当成 关键字参数传给视图函数# 在app目录下的views.py文件中写入:"""from django.shortcuts import render, HttpResponse# Create your views here.def test(request, bbb):print(bbb)print(\'test\')return HttpResponse(\'test\')"""
4. 反向解析
# 反向解析其实就是:通过一个路由别名 可以得到别名所在的这行路由的 完整地址路由是可以起别名的\'\'\'以下都是直接访问原始域名:127.0.0.1:8000\'\'\'# 1.后端反向解析# 在urls.py文件中写入:"""url(r\'^$\', views.home), # 客户输入默认域名 就是访问首页url(r\'^v1/v2/v3/v4/v5/test/\', views.test, name=\'test\'),"""# 在app目录下的views.py文件中写入:"""from django.shortcuts import HttpResponse, reverse# Create your views here.def home(request):# 后端反向解析print(reverse(\'test\'))return HttpResponse(\'home\')"""# 2.前端反向解析# 在urls.py文件中写入:"""url(r\'^$\', views.home), # 客户输入默认域名 就是访问首页url(r\'^test\', views.test, name=\'test\'),"""# 在app目录下的views.py文件中写入:"""from django.shortcuts import render, HttpResponse, reverse# Create your views here.def home(request):# 前端反向解析print(reverse(\'test\'))return render(request, \'home.html\')"""# 新建home.HTML文件:<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head><body><a href="{% url \'test\' %}">反向解析</a></body></html># 3.后端无名带参数的反向解析# 在urls.py文件中写入:"""url(r\'^$\', views.home), # 客户输入默认域名 就是访问首页url(r\'^test/(\\d+)\', views.test, name=\'test\'),"""# 在app目录下的views.py文件中写入"""from django.shortcuts import render, HttpResponse, reverse# Create your views here.def home(request):# 后端反向解析print(reverse(\'test\', args=(111, )))return HttpResponse(\'home\')"""# 4.后端有名带参数的反向解析# 在urls.py文件中写入:"""url(r\'^$\', views.home), # 客户输入默认域名 就是访问首页url(r\'^test/(?P<aaa>\\d+)\', views.test, name=\'test\'),"""# 在app目录下的views.py文件中写入"""from django.shortcuts import render, HttpResponse, reverse# Create your views here.def home(request):# 后端反向解析print(reverse(\'test\', kwargs={\'aaa\': 1111}))return HttpResponse(\'home\')"""# 5.前端无名带参数的反向解析# 在urls.py文件中写入:"""url(r\'^$\', views.home), # 客户输入默认域名 就是访问首页url(r\'^test/(\\d+)\', views.test, name=\'test\'),"""# 在app目录下的views.py文件中写入"""from django.shortcuts import render, HttpResponse, reverse# Create your views here.def home(request):# 前端反向解析return render(request, \'home.html\')"""# home.HTML文件:"""<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head><body><a href="{% url \'test\' 111 %}">反向解析</a></body></html>"""# 6.前端有名带参数的反向解析# 在urls.py文件中写入:"""url(r\'^$\', views.home), # 客户输入默认域名 就是访问首页url(r\'^test/(?P<aaa>\\d+)\', views.test, name=\'test\'),"""# 在app目录下的views.py文件中写入"""from django.shortcuts import render, HttpResponse, reverse# Create your views here.def home(request):# 前端反向解析print(reverse(\'test\', kwargs={\'aaa\': 111}))return render(request, \'home.html\')"""# home.HTML文件:"""<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head><body><a href="{% url \'test\' aaa=111 %}">反向解析</a></body></html>"""
5. 路由分发
# 重点以后我们的django项目会越来越大,那么就会导致总路由文件会越来越大,就会非常难维护,我们会把总路由分开到不同的应用下面\'\'\'django的每一个应用都支持有自己的对应配置:urls.pytemplatesstatic\'\'\'# 使用路由分发一般都是多个应用1.先再创建一个应用startapp app02创建完成后记得到settings.py中配置2.将 urls.py文件复制一份到app01、app02目录下# 实现路由分发方式一:# 访问:127.0.0.1:8000/app01/index/# 访问:127.0.0.1:8000/app02/index/1.总路由 urls.py中写入:"""from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsfrom django.conf.urls import includefrom app01 import urls as app01_urlsfrom app02 import urls as app02_urlsurlpatterns = [url(r\'^admin/\', admin.site.urls),url(r\'^$\', views.home), # 客户输入默认域名 就是访问首页url(r\'^app01/\', include(app01_urls)),url(r\'^app02/\', include(app02_urls))]"""2.app01 urls.py文件中写入:"""from django.conf.urls import urlfrom app01 import viewsurlpatterns = [url(r\'^index\', views.index),]"""3.app02 urls.py文件中写入:"""from django.conf.urls import urlfrom app02 import viewsurlpatterns = [url(r\'^index\', views.index),]"""4.app01 views.py文件中写入:"""from django.shortcuts import HttpResponse# Create your views here.def index(request):return HttpResponse(\'app01:index\')"""5.app02 views.py文件中写入:"""from django.shortcuts import HttpResponse# Create your views here.def index(request):return HttpResponse(\'app02:index\')"""# 实现路由分发方式二:在总路由 urls.py中写入:"""from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsfrom django.conf.urls import includeurlpatterns = [url(r\'^admin/\', admin.site.urls),url(r\'^$\', views.home), # 客户输入默认域名 就是访问首页url(r\'^app01/\', include(\'app01.urls\')),url(r\'^app02/\', include(\'app02.urls\'))]"""
6. 名称空间
# 当多个应用出现相同的别名时,反向解析就没办法识别了1.在总路由urls.py文件中:"""from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsfrom django.conf.urls import includeurlpatterns = [url(r\'^admin/\', admin.site.urls),url(r\'^$\', views.home), # 客户输入默认域名 就是访问首页url(r\'^app01/\', include(\'app01.urls\', namespace=\'app01\')),url(r\'^app02/\', include(\'app02.urls\', namespace=\'app02\'))]"""2.在app01的urls.py文件中:"""from django.conf.urls import urlfrom app01 import viewsurlpatterns = [url(r\'^index\', views.index, name=\'app01_index\'),url(r\'^home\', views.home, name=\'index\'),]"""3.在app01的views.py文件中:"""from django.shortcuts import render, HttpResponse, reverse# Create your views here.def index(request):return HttpResponse(\'app01:index\')def home(request):print(reverse(\'app01:app01_index\'))print(reverse(\'app02:app02_index\'))return HttpResponse(\'home\')"""4.在app02的urls.py文件中:"""from django.conf.urls import urlfrom app02 import viewsurlpatterns = [url(r\'^index\', views.index, name=\'app02_index\'),]"""5.在app02的views.py文件中:"""from django.shortcuts import HttpResponse# Create your views here.def index(request):return HttpResponse(\'app02:index\')"""
7. 虚拟环境
# 针对不同的项目,创建出来一个新的python环境,类似于是一个新的python解释器