42.django03
文章目录
- 1.ORM建立表关系
- 1.1设置路由创建基表
- 1.设置路由
- 2.创建表基表
- 1.2第二步确定关系
- 1.3第三步设置配置
- 1.4数据库迁移命令
- 1.5总结
- 2.Django请求生命周期图
- 3.路由层
- 3.1路由匹配
- 3.2自动补全/
- 3.3限制匹配以什么开头
- 3.4限制匹配以什么结尾
- 3.5设置主页
- 3.6设置尾页
- 4.无名分组
- 5.有名分组
- 6.分组是否混合使用
- 6.1混用测试
- 6.2多次使用
- 7.反向解析
- 7.1起别名
- 7.2前端使用反向解析
- 7.3后端使用反向解析
- 7.4无名分组反向解析
- 1.后端
- 2.前端
- 3.总结
- 7.4有名分组的反向解析
- 1.前端
- 2.后端
- 3.总结
- 8.路由分发
- 8.1创建多个app
- 8.2子路由
- 8.3总路由
- 9.名称空间
- 9.1设置名称空间
- 1.后端
- 2.前端
- 9.2统一解决方式
- 10.伪静态
- 11.虚拟化环境
- 11.1创建虚拟环境
- 12.Django版本区别
- 13.视图层
- 14.JsonResponse对象
- 14.1传字符串
- 1.方式1
- 2.解决编码问题
- 3.方式2
- 4.解决编码问题
- 14.2传列表
- 1.报错
- 2.解决问题
- 15.for表单上传文件
- 16.request补充
文件位置链接:
https://pan.baidu.com/s/1dtFp6Y1ght8wma3D96C1jA
提取码:zxn7
1.ORM建立表关系
方法:
1. 创建表关系,先将基表创建出来。
2. 然后再添加外键字段。
book | publish | ||||
---|---|---|---|---|---|
id | title | price | id | name | addr |
1 | linux | 123.0 | 1 | 上海出版社 | 上海 |
2 | python | 456.0 | 2 | 北京出版社 | 北京 |
author | authordetail | ||||
---|---|---|---|---|---|
id | name | age | id | phone | addr |
1 | kid | 18 | 1 | 10086 | 上海 |
2 | qz | 19 | 1 | 10010 | 北京 |
1.1设置路由创建基表
1.设置路由
from django.conf.urls import url
from import views
urlpatterns = [url(r'reg/', views.reg)
]
2.创建表基表
# 书表
class Book(models.Model):# 1.id字段自动生成# 2.书名字典串title = models.CharField(max_length=32)# 3.价格 小数 共8位小数占2位price = models.DecimalField(max_digits=8, decimal_places=2)# 出版社
class Publish(models.Model):# 名称name = models.CharField(max_length=32)# 地址addr = models.CharField(max_length=32)# 作者
class Author(models.Model):# 名字name = models.CharField(max_length=32)# 年龄age = models.IntegerField()# 作者详情表
class AuthorDetail(models.Model):# 手机号码phone = models.CharField(max_length=32)# 住址addr = models.CharField(max_length=32)
1.2第二步确定关系
表与表之间:
一对一
一对多
多对多
关系判断:换位思考书 与 出版社:
书 能被多个出版社出版吗,X
出版社能出版多本书吗 √一对多的关系,外键建在多的一方。书 与 作者:
书可以被多个作者著作 √
多个作者可以著作一本书 √多对多的关系,在ORM中外键建在查询频率高的一方,ORM会自动创建第三张表。作者 与 作者信息:
一个作者可以有个信息 X
一个信息可以给多个作者 X
作者与作者信息有关系 打勾一对一关系,外键建在查询频率高的一方。
from django.db import models# 书表
class Book(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=8, decimal_places=2)# 图书和出版社一对多的关系:书是多的一方,外键建在书表里# 默认与出版社的主键指端字段做关联publish = models.ForeignKey(to='Publish')# 书和作者是多对多的关系,外键字段建在任意一方都可以,推荐键在查询频率高的一方# ORM会自动自动创建第三张表authors = models.ManyToManyField(to="Author") # 默认关联的是主键# authors是一个虚拟字典主要是用来告诉ORM书表和作者表是多对多的关系,# 让ORM自动帮创建第三张表,在book下建立 名称就是app02_book_authors# 虚拟的表中存( 主键id book_id author_id)三个字段,不区分大小写的。# 出版社
class Publish(models.Model):name = models.CharField(max_length=32)addr = models.CharField(max_length=32)# 作者
class Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()# 作者表与作者详情表是一对一的关系,外键建立在查询频率高的表中author_datail = models.OneToOneField(to="AuthorDetail")# 作者详情表
class AuthorDetail(models.Model):phone = models.CharField(max_length=32)addr = models.CharField(max_length=32)
1.3第三步设置配置
先手动创建一个库。
Navicat中创建库。在去settings中更换默认的库。
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'day61','USER': 'root','PASSWARD': '123','HOST': '127.0.0.1','POST': 3306,'CHARSET': 'utf8'}
}
在应用下__init__.py中设置替换库。
import pymysql
pymysql.install_as_MySQLdb()
1.4数据库迁移命令
python manage.py makemigrations
python manage.py mograte
如果运行出错找不文件路径,在settings中将原本的'DIRS'的配置替换。将template的路径添加到环境变量中的设置更改一个。
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],···
1.5总结
publish = models.ForeignKey(to='Publish')author_datail = models.OneToOneField(to="AuthorDetail")ForeignKey 与 OneToOneField 会自动在字段中添加_id后缀authors = models.ManyToManyField(to="Author")在Django1.x版本中外键默认都是级联更新,级联删除的。
2.Django请求生命周期图
3.路由层
3.1路由匹配
在urls.py中创建两个路由。
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'test', views.test),url(r'testadd', views.testadd),
]
在app01 下views.py中创建test,testadd函数。
from django.shortcuts import render, HttpResponse, redirectdef test(request):return HttpResponse('test')def testadd(request):return HttpResponse('testadd')
启动程序:
分别输入:
127.0.0.1:8000/test
127.0.0.1:8000/testadd
会发现两次放回的都是test。
从上往下依次匹配,testadd符合了test查询条件
url方法第一个参数是正则表达式,
只要第一个参数正则表达式能够匹配到内容,那么就会立刻停止往下匹配。
直接执行对应的视图函数。
3.2自动补全/
为test,testadd加上/。
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'test/', views.test),url(r'testadd/', views.testadd),
]
分别输入:
127.0.0.1:8000/test/
127.0.0.1:8000/testadd
第一次返回正常,
第二次没有在testadd后面加/被自动补全了(Django的功能)
127.0.0.1:8000/testadd 回车,第一次请求发送,url中匹配不到,
这个时候Django在帮在testadd后加一个/斜杆,做一个重定向。
再发送请求,第二次匹配到了返回结果。
在settings中设置
取消自定加斜杠
APPEND_SLASH = Fasle # 默认True
3.3限制匹配以什么开头
输入:
127.0.0.1:8000/123456test/
也能正常访问,因为能被正则表达式匹配到。
设置路由的正则匹配^tes/,加上尖号,表示以test开头。
url(r'^test/', views.test),
3.4限制匹配以什么结尾
输入:
127.0.0.1:8000/test/asdas
也能正常访问,因为能被正则表达式匹配到。
设置路由的正则匹配^tes/$,加$号,表示以test结尾。
3.5设置主页
每次在访问127.0.0.1:8000
都显示404.不太好看。
urls.py添加路由关系。
views.py中返回一个home页面。
url(r'', views.home)
def home(request):return HttpResponse('home页面')
输入:
127.0.0.1:8000/test/
127.0.0.1:8000/testadd/
返回的都是home页面。
# 重新修改:
url(r'^$', views.home)
3.6设置尾页
访问出错404.的页面就是尾页
异常捕捉机制,以后补上。
4.无名分组
无名分组就是将括号内的正则表达式匹配到的内容当作位置参数传递给后面的视图函数。
url(r'^test/[0-9]{4}', views.test)
test/后面跟4位数字0-9的组合、127.0.0.1:8000/test/1516
url(r'^test/\d+/', views.test),
\d 匹配数字
\d+ 匹配一个或多个127.0.0.1:8000/test/1516516515
url(r'^test/(\d+)/', views.test)
正则表达式加上括号就是分组。
分组:给某一段表达式用小括号括起来127.0.0.1:8000/test/1516516515
test() takes 1 positional argument but 2 were given
需要一个参数,给了两个。
def test(request,xxx):
print(xxx)return HttpResponse('test')
修改之后在
127.0.0.1:8000/test/1516516515
网页正常访问
程序的终端会打印
1516516515
之后测试,/后面输入什么就打印什么
5.有名分组
有名分组就是将括号内的正则表达式匹配到的内容当作关键字参数传递给后面的视图函数。
可以给正则表达式起一个别名。
url(r'^testadd/(?P<year>\d+)', views.testadd)
?P<别名>正则表达式
127.0.0.1:8000/testadd/1516
testadd() got an unexpected keyword argument 'year'
多了一个关键字参数,修改视图函数。
def testadd(request, year):print(year)return HttpResponse('testadd')
修改之后在
127.0.0.1:8000/testadd/1516
网页正常访问
程序的终端会打印
1516
之后测试,/后面输入什么就打印什么
6.分组是否混合使用
不能混用分组,但是单独的一个分组可以使用N多次。
6.1混用测试
url(r'^test/(\d+)/(?P<year>\d+)/', views.test),
def test(request, args,year):print(args,year)return HttpResponse('test')
http://127.0.0.1:8000/test/1516/2626
test() missing 1 required positional argument: 'args'
缺少一个参数args。
6.2多次使用
url(r'^test/(\d+)/(\d+)/(\d+)/', views.test),
def test(request, *args, **kwargs):print(args,kwargs)return HttpResponse('test')
127.0.0.1:8000/test/1516/2626/266/223/323/23/
设置了几个分组就接受几组,
打印:
1516 2626 266
url(r'^test/(?P<asd>\d+)/(?P<asdd>\d+)', views.test),
127.0.0.1:8000/test/1516/451/13456454/56165/511/
设置了几个分组就接受几组,
打印:
{'asd': '1516', 'asdd': '451'}
7.反向解析
通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数。
1.先给路由与视图函数起一个别名
2.方向解析:1.后端反向解析2.前端反向解析
# 1.建立路由
url(r'^func/$', views.func)
# 2.视图函数
from django.shortcuts import render, HttpResponse, redirectdef home(request):return render(request, 'home.html')def func(request):return HttpResponse('func')
# 3.home页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>主页</title>
</head>
<body>
<a href="/func/">111</a>
</body>
</html>
需求,可能随便的修改func的名称。
7.1起别名
1.起一个别名。
url(r'^func_k/$', views.func, name='ooo')
7.2前端使用反向解析
修改a标签。
<a href="{% url 'ooo' %}">111</a>
现在无论怎么去修改路径的名称,前端都可以随之更新。
将
func
改为:as、 dsa、 asas、 ···都可以正常跳转到index页面。
7.3后端使用反向解析
导入reverse模块。
from django.shortcuts import reverse
def home(request):print(reverse(('ooo'))) # /名称/return render(request, 'home.html')
改为:as、 dsa、 asas、 ···都可以正常获取到路径的名称。
7.4无名分组反向解析
替换之前的代码。
1.urls.py
2.app0下的views.py
3.templates文件下的home.html
url(r'^index/(\d+)/', views.index, name='ooo') # 设置无名分组
from django.shortcuts import render, HttpResponse, reversedef home(request):print(reverse('ooo')return render(request, 'home.html')def index(request, args):return HttpResponse('index')
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>首页</h1>
<a href="{% url 'ooo' %}">编辑</a>
</body>
</html>
输入
127.0.0.1:8000
在执行到reverse('ooo')时报错:还需要指定一个参数,能够被(\d+)匹配到Reverse for 'xxx' with no arguments not found. 1 pattern(s) tried: ['index/(\\d+)/']^index/(\d+)/ index/数字/ index可以被更改但是后面的数据没法匹配。
1.后端
# 修改home函数的
print(reverse('xxx', args=(1,))) # /index/1/
再次访问:
127.0.0.1:8000
程序终端打印
/index/1/
127.0.0.1:8000/index
报错 404
127.0.0.1:8000/index/1515
127.0.0.1:8000/index/1515565
127.0.0.1:8000/index/1515565515
都可以正常访问。
后端只要指定参数能被 (\b+)匹配到,就能访问成功。
2.前端
前端也同样只要指定参数能被 (\b+)匹配到,就能访问成功。
{% url 'xxx' 123 %}
# 修改home.html
<body>
<h1>首页</h1>
<a href="{% url 'xxx' 123 %}">编辑</a> <!--index/123/ -->
</body>
再次访问
127.0.0.1:8000
在页面右击检测,检测源码:
···
<a href="/index/123/ }">编辑</a>
···
3.总结
通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数。
也就是路由名对应的路径。
这个数字写代码的时候一帮放的是数据的主键值,对数据的进行编辑和删除。url(r'^edit/(\d+)/', views.edit, name='xxx')后端:
def edit(reequest, edit_id):reverse('xxx', args=(edit_id,))前端:
{% for user_obj in user_queryset %}
<a href="{% url 'xxx' user_obj_id %}">编辑</a>
{% endfor %}
7.4有名分组的反向解析
url(r'^func/(?P<year>\d+)/', views.func, name='ooo')
from django.shortcuts import render, HttpResponse, reverse
def home(request):# 有名分组的方向解析写法 1print(reverse('ooo', kwargs={'year': 123}))# 简便写法(与无名的操作一样)print(reverse('ooo', args=(111,)))return render(request, 'home.html')
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>首页</h1>
<a href="{% url 'ooo' year=123 %}">编辑</a> <!--func/123/ --><a href="{% url 'ooo' 123 %}">编辑</a> <!-与无名操作一样-->
</body>
</html>
1.前端
<a href="{% url 'ooo' 123 %}">编辑</a> <!-与无名操作一样-->
2.后端
print(request('ooo', args=(111,)))
3.总结
只要添加的参数符合(\b匹配到,就能访问成功。
8.路由分发
django每一个应用都可以有自己的templates文件夹,url.py, static文件夹。
基于上述的特点,django能够非常好的做到分组开发(每个人开发自己的app应用)
当一个django项目中url特别多的时候,总路由urls.py代码非常冗余不好维护,同样可以利用路由分发来减轻总路由的压力。
将多个app应用全部拷贝到一个新的django项目中。
然后再配置文件中注册,利用路由分发的特点所有的app整合起来。
8.1创建多个app
python manage.py startapp app02
创建好之后在settings中注册
在app02和APP02中创建
urls.py
8.2子路由
# app01下的urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [url(r'reg/', views.reg)
]
# app01下的views.py
from django.shortcuts import render, HttpResponsedef reg(request):return HttpResponse('app01:reg')
# app02下的urls.py
from django.conf.urls import url
from app02 import views
urlpatterns = [url(r'reg/', views.reg)
]
# app02下的views.py
from django.shortcuts import render, HttpResponsedef reg(request):return HttpResponse('app02:reg')
利用视图分发之后总路由不再干路由与视图的直接对应关系,而是做一个分发处理:
识别单前url是始于那个app下的,直接发给对应的app应用去处理
8.3总路由
路由分发,导入一个include模块,只要url前缀是appxx开头就全部交给appxx处理。
# 总路由的urls.py 写法1
from django.conf.urls import url, include
from django.contrib import admin
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [url(r'^admin/', admin.site.urls),# 路由分发,导入一个include模块# 只要url前缀是appxx开头就全部交给appxx处理url(r'^app01/', include(app01_urls)),url(r'^app02/', include(app02_urls)),
]
# 总路由的urls.py 写法2(不能加$ 符号设置结尾)
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [url(r'^admin/', admin.site.urls),# 路由分发,导入一个include模块# 只要url前缀是appxx开头就全部交给appxx处理url(r'^app01/', include('app01.urls')),url(r'^app02/', include('app02.urls')),
]
输入:
127.0.0.1/app01/reg
127.0.0.1/app02/reg
访问各自app的独自页面
9.名称空间
# 在app01/02下urls.py中分别起别名为reg
urlpatterns = [url(r'^reg/', views.reg, name='reg')
]#在app01/02下views.py中添加反向解析
def reg(request):print(reverse('reg'))return HttpResponse('APP02:REG')
输入:
127.0.0.1/app01/reg
127.0.0.1/app02/reg
访问各自app的独自页面终端结果:
/app02/reg/
/app02/reg/
当多个应用出现了相同的别名,正常情况下反向解析式无法自动识别前缀的。
9.1设置名称空间
在路由分发中设置namespace参数。设置名称空间。
1.后端
# 在app01/02下urls.py中分别设置自己的名称空间
url(r'^app01/', include('app01_urls', namespace='app01')),
url(r'^app02/', include('app02_urls', namespace='app02')),
#在app01下views.py中重新添加反向解析
def reg(request):print(reverse('app01'))return HttpResponse('APP02:REG')
#在app02下views.py中重新添加反向解析
def reg(request):print(reverse('app02'))return HttpResponse('APP02:REG')
输入:
127.0.0.1/app01/reg
127.0.0.1/app02/reg
访问各自app的独自页面终端结果:
/app01/reg/
/app02/reg/
2.前端
分别在app01/02下创建创建templates文件夹,
在分别创建app01/02_reg.html页面.
# app01设置一个主页reg.html。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>app01 - reg</title>
</head>
<body>
<a href="{% url 'app01:reg' %}"></a>
</body>
</html>
# app02设置一个主页reg.html。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>app02 - reg</title>
</head>
<body>
<a href="{% url 'app02:reg' %}"></a>
</body>
</html>
分别返回自己reg页面。设置的时候名字重复了就会有问题。
return render(request,'app01_reg.html')return render(request,'app02_reg.html')
浏览器右击检查源代码<a href="/app01/reg/"></a><a href="/app02/reg/"></a>
9.2统一解决方式
保证名字不冲突,就没有不要使用名称空间了。一般情况下,有多个APP的时候在起别名的时候加上app的前缀,
这样的话就能保证多个app之间的名字不冲突。
10.伪静态
静态网页:数据写死的了。伪静态网页:将动态网页伪装成静态网页。
伪装的目的是在于增打本网站上seo查询力度,并且增加搜索引擎收藏本网站的概率。
搜索引擎本质就是一个巨大的爬虫程序。搜索引擎发现这个网站是一个静态页面,
会认为这个页面时不会修改了的,浏览器会优先收藏,在搜索是自己的文档会优先被浏览器展示,
(刚不过人民币玩家-)。
# 在url中设置,访问加上.html
urlpatterns =[ url(r'^reg.html', views.reg, name='reg')]
11.虚拟化环境
在程序开发中给每一个项目配置一个独有的解释器环境,环境内的模块缺什么安装什么。用不上的一概不装。
虚拟环境: 虚拟一个纯净的python解释器。
虚拟环境不要创建太多,需要消耗硬盘空间的拓展:
每一个项目都需要很多的模块,并且每一个模块版本还可能不一样,
开发当中会为项目配置一个requirements.txt文件里面书写了所有的模块和版本,
只需要输入一条命令就可以一键安装所有的模块和版本。
11.1创建虚拟环境
创建需要一些时间,会生成一个venv的文件夹。
只有两个模块。
12.Django版本区别
Django版本 1.x2.x3.x
django1.x路由使用的是url方法而在django2.x和3.x中路由层使用的是path方法。
url()第一个参数支持正则表达式path()第一个参数不支持正则表达式,
写什么就是什么。如果不习惯使用path ,可以导入re_path模块,支持正则表达式。
re_path(r'^xxx',xxx), re_path等价于url。虽然path不支持正则,
但它支持五种转换器以及自定转换器。path('index/<int:id>/')将第二个路由里面的内容转换为整型,
以关键字的形式传递给后面的视图函数。模型层中1.x外键默认都是级联更新级联删除的,
但是到了2.x和3.x中需要自己手动写配置参数。
13.视图层
视图层三板斧HttpResponse:
返回字符串类型
render: 返回HTML页面,并在返回浏览器前还能给HTML文件传值
redirect: 重定向研究三者源码可得结论:视图函数必须要返回一个HttpResponse。否继承了同一个类。
定一个视图为直接写pass,运行后代码报错,未返回HttpResponse对象。
The view app01.views.index didn't return an HttpResponse object. It returned None instead.
# render简单内部原理:
···ret = res.render(con) print(ret) return HttpResponse(ret)
14.JsonResponse对象
json格式:前后端数据交互,需要使用json作为过渡,实现跨语言传输数据。
14.1传字符串
后端给前端浏览器返回一个json格式的字符串。
方式1:HttpResponse返回一个json格式的字符串。
方式2:JsonResponse返回一个json格式的字符串。
1.方式1
import json
def reg(request):user_dir = {'name': 'kid', 'age': 18, 'gender': '男'}user_dir = json.dumps(user_dir)return HttpResponse(user_dir)
127.0.0.1:8000/app02/reg/
{"name": "kid", "age": 18, "gender": "\u7537"}
2.解决编码问题
设置dumps的ensure_ascii参数,不转码。
user_dir = json.dumps(user_dir, ensure_ascii=False)
127.0.0.1:8000/app02/reg/
{"name": "kid", "age": 18, "gender": "男"}
3.方式2
from django.http import JsonResponse
def reg(request): user_dir = {'name': 'kid', 'age': 18, 'gender': '男'} return JsonResponse(user_dir)
4.解决编码问题
查看源码JsonResponse内部还是继承了HttpResponse类,
内部也是通过json.dumps()转码的,修改参数json_dumps_params。
return JsonResponse(user_dir, json_dumps_params={'ensure_ascii': False})
14.2传列表
from django.http import JsonResponse
def reg(request): user_list = ['kid', 18, '男'] return JsonResponse(user_list, json_dumps_params={'ensure_ascii': False})
1.报错
In order to allow non-dict objects to be serialized set the safe parameter to False.为了允许序列化非dict对象,请将safe参数设置为False。
2.解决问题
设置safe参数设置为False。
return JsonResponse(user_list, json_dumps_params={'ensure_ascii': False}, safe=False)
["kid", 18, "男"]
15.for表单上传文件
request.FILES获取文件
from表单上传文件类型的数据:1. method="post" 2. enctype="multipart/form-data"
url(r'^ab_file/', views.ab_file)
from django.shortcuts
import render
def ab_file(request): if request.method == 'POST': print(request.POST) # 获取键值对的文本信息 print(request.FILES) # 获取文件 file_obj = request.FILES.get('file') # 通过名称获取文件 print(file_obj.name) # 文件名称 with open(file_obj.name, mode='wb') as f: # 写入 for line in file_obj.chunks(): # 推荐写法与for line in file_obj效果一样f.write(line) return render(request, 'file.html')
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><form action="" method="post" enctype="multipart/form-data"></form> <p>username: <input type="text" name="username"></p> <p>file: <input type="file" name="file"></p> <input type="submit"></body>
</html>
127.0.0.1:8000/app02/ab_file/
选择文件提交Forbidden (403)
注释掉settings中的MIDDLEWARE = [
#'django.middleware.csrf.CsrfViewMiddleware'
]
再次访问、提交、
<QueryDict: {'username': ['kid']}><MultiValueDict: {'file': [<InMemoryUploadedFile: a.png (image/png)>]}>a.png
16.request补充
request.path 获取路由request.path_info 获取路由request.get_full_path
获取路由加路由?后面的参数reques.body 原生浏览器发送过来的二进制数据。
url(r'^test/', views.test)
def test(request): print(request.path) print(request.path_info) print(request.get_full_path()) return HttpResponse('text')
输入:
127.0.0.1:8000/app02/test
/app02/test/
/app02/test/
/app02/test/输入:
127.0.0.1:8000/app02/test/565456
/app02/test/565456/
/app02/test/565456/
/app02/test/565456/输入:127.0.0.1:8000/app02/test/?565456
/app02/test/
/app02/test/
/app02/test/?565456
# 上传的时候文佳格式错了一点点
42.django03相关推荐
- 项目管理5大过程组,42个过程一句话讲解
2019独角兽企业重金招聘Python工程师标准>>> 启动过程组:(1)制定项目章程:诞生项目,并为项目经理"正名": (2)识别干系人:搞清楚谁与项目相关: ...
- 42. fastjson处理下划线和驼峰问题的方法和源码分析
一. 前言 在开发过程中经常遇到json解析和生成的问题,所以用自己也一直用fastjson来实现这个功能. 但是,最近遇到一个问题: json字符串里面的数据很多都是"_"下划线 ...
- 《中国人工智能学会通讯》——1.42 理解情感
1.42 理解情感 安德鲁·摩尔认为,人工智能能"感受"人类情感是人工智能研究领域最重要.也最先进的一个方向.扬波利斯基认为,计算机能够理解语言的能力最终会向人和计算机" ...
- CIR:2020年全球数据中心应用AOC市场达$42亿
未来十年,QSFP和CXP将占有源光缆销售收入的大部分.到2020年,QSFP+和QSFP28销售收入将分别达到7.27亿美元和7.41亿美元. 根据CIR(CommunicationsIndustr ...
- Tidio AI 趋势报告:约42%受访者能够接受机器人伴侣
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 文章内图源:Tidio 近日,波士顿动力发布了一段机器人跳舞的视频,有些人不敢相信他们所看到的,它看起来更像是皮克斯动画而不是真 ...
- 赠书福利 | Tidio AI 趋势报告:约42%受访者能够接受机器人伴侣
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 文章内图源:Tidio 近日,波士顿动力发布了一段机器人跳舞的视频,有些人不敢相信他们所看到的,它看起来更像是皮克斯动画而不是真 ...
- 深度学习如炼丹,你有哪些迷信做法?网友:Random seed=42结果好
Datawhale推荐 编辑:陈萍.杜伟,来源:机器之心 调参的苦与泪,还有那些「迷信的做法」. 每个机器学习领域的研究者都会面临调参过程的考验,当往往说来容易做来难.调参的背后往往是通宵达旦的论文研 ...
- 国内42所一流大学综合排名出炉!清北之后谁是国内第三?
编辑:Sophia 计算机视觉联盟 报道 公众号 CVLianMeng 转载于 :学科竞赛 国内目前共有42所世界一流建设高校,其中36所A类,6所B类,整理这42所双一流高校在U.S.News.Q ...
- 42所双一流大学校长情况简介(2019年)
点击上方"视学算法",选择"星标"公众号 重磅干货,第一时间送达 转载自公众号:双一流高校 进入新时代以来,国家实施了世界一流大学和一流学科建设工程,简称&qu ...
最新文章
- 工程介绍好处费性质_水运工程造价工程师继续教育课件上新丨海外水运工程造价编制介绍课程发布...
- svn版本控制git(github)
- springboot actuator监控笔记
- pass information between XXX.Aspx and XXX.Aspx.cs
- 运算符的计算机制和原则
- 在微信浏览器中 location.reload() 不刷新解决方案(直接调用方法)
- couchbase_使用Couchbase分页
- Ubuntu中用gedit保存文件失败的解决办法
- ftp服务器收集文件,ftp服务器收集文件
- java centertoscreen_java screen的配置详解及注意事项
- C语言除法浮点型和整形,浅谈C语言整型与浮点型转换
- 菜鸟的mybatis实战教程
- 几分钟就可做出的酷炫PPT动画效果
- java 将海外时区转换为北京时区
- IBM技术论坛:使用 Cobertura 和反射机制提高单元测试中的代码覆盖率
- Python 并发编程(进程)
- 深入理解空间金字塔池化(SPP,ASPP)
- css中的div容器笔记
- PostgreSQL数据库自带的命令行工具--psql
- php仪表盘,基于HTML5 canvas的仪表盘插件
热门文章
- Unity密室逃脱-逃离房间游戏源码.,支持安卓+IOS双端 unity2021 C#语言开发
- NRF51822开发笔记-5.nRF51822裸机实验GPIO输出驱动LED
- IRS应用发布之十五:应用安全自测指南
- 【 WinForm】全屏截图,控件截图,句柄截图
- `GoogleAppMeasurement` requires CocoaPods version `>= 1.10.2`, which is not satisfied by your cu
- WVS安全测试工具使用教程
- IDEA如何远程断点调试jar包
- c++,vector的erase循环删除
- 防窜货PDA扫描程序 APP 出入库扫描打印
- 汇编语言:定时器实现数码管0-99