THU.路由介绍及 JsonResponse
路由介绍
路由匹配
# 路由匹配
url(r'test', views.test),
url(r'testadd', views.testadd)
"""
url 方法第一个参数是正则表达式
只要第一个参数正则表达式能够匹配到的内容,name 就会立刻停止往下匹配
直接执行对应的视图函数
输入 url 的时候会默认加 '/'
Django 内部会自动进行重定向
'/' 会在进行一次匹配
"""
分组
- 给某一段正则表达式用小括号括起来
无名分组
url(r'^test/(\d+)/', views.test)
def test(request, xx):
print(xx)
return HttpResponse('收到了 宝贝')
无名分组就是将括号内正则表达式匹配到的内容当做位置参数传递给后面的视图函数
有名分组
url(r'^test/(?P<year>\d+)/', views.testadd)
def test(request, aa):
print(aa)
return HttpResponse('收到了 宝贝')
有名分组就是给正则表达式起别名,并将匹配到的内容作为关键字参数传递给后面的视图函数
注意
1、无名分组与有名分组不能混用
2、同一分组可以重复使用
url(r'^test/(\d+)/(\d+)/(\d+)/', views.test)
url(r'^test/(?P<year>\d+)/(?P<month>\d+)/(?P<day>\d+)/', views.testadd)
反向解析
1、给路由与视图函数起一个别名
- 后端反向解析
from django.shortcuts import render, HttpResponse, redirect, reverse
reverse('xxx')
- 前端反向解析
<a href="{% url 'xxx' %}"></a>
无名分组反向解析
url(r'^index/(\d+)', views.index, name='xxx')
# 前端
{% url 'xxx' 123 %}
# 后端
reverse('xxx', args=(1,))
"""
这个数字一般用来存放数据的主键值 -- 数据的编辑和删除
"""
url(r'^index/(\d+)', views.index, 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'^test/(?P<year>\d+)/', views.testadd, name='ooo')
# 后端
No.1 Scheme
def home(request):
print(reverse('ooo', kwargs{'year'=123}))
No.2 Scheme
print(reverse('ooo', args=(123,)))
# 前端
No.1 Scheme
<a href="{% url 'ooo' year=123 %}"></a>
No2.Scheme
<a href="{% url 'ooo' 123 %}"></a>
# No.1 Scheme 了解即可,主要使用 No.2 Scheme
路由分发
-
Django 的每一个应用都可以有自己的 templates 文件夹、urls.py、static 文件夹
正式基于上述的特点,Django 能够非常好的做到分组开发,最后再在配置文件中将所有 app 利用路由分发的特点组织整合即可
-
当一个Django 项目中的 url 特别多的时候,总路由 urls.py 代码将会非常冗余,不好维护,因此可以利用路由分发来减轻总路由的压力
-
利用路由分发之后,总路由不再与视图函数直接对应,而是做分发出来
- 识别当前 url 是属于哪个应用,直接分发给对应应用处理
# 初级版
from django.conf.urls import url, include
from django.contrib import admin
from study import views as study_urls
from table import views as table_urls
urlpatterns = [
url(r'^study', include(study_urls)),
url(r'^table', include(table_urls)),
]
# 终极版
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^study', include('study.ruls')),
url(r'^table/', include('table.urls')),
强调
总路由中,最后不能加$($表示终止匹配)
名称空间
当多个应用出现相同的别名,正常情况下的反向解析是无法自动识别前缀的
# 名称空间
总路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^study', include('study.ruls', namespace='study')),
url(r'^table/', include('table.urls', namespace='table')),
前端
{% url 'study:home' %}
{% url 'table:home' k %}
# 其实只要保证名字不冲突,就没有必要使用名称空间 -- 在名字前加上 app 前缀
"""
一般情况下 有多个 app 的时候我们在起别名的时候会加上 app 的前缀,这样的话就能够确保多个 app 之间名字不冲突
"""
伪静态
静态网页
- 数据是写死的,万年不变
伪静态
- 将一个动态网页伪装成静态页面
为什么要伪装
- 伪装的不低在于增大本网站的 seo 查询力度
- 增加搜索引擎收藏本网址的概率
搜索引擎本质上就是一个巨大的爬虫程序
如何伪装
-url(r'^study.html',include('study.ruls')) # 加上.hrml 后缀即可
Jsonresponse对象
Json 格式有什么用
- 实现前后端交互的一种数据格式,实现跨语言之间的数据通信
No.1 Scheme -- 调用 json 模块
def checkout(request):
user_dict = {'IU': ' 大宝贝', 'Alex': 19}
json_dict = json.dumps(user_dict, ensure_ascii=False)
return HttpResponse(json_dict)
No.2 Scheme -- 使用 JsonResponse 方法
def checkout(request):
user_dict = {'IU': '大宝贝', 'Alex': 19}
return JsonResponse(user_dict, json_dumps_params={'ensure_ascii': False}, content_type='application/json; charset=utf-8')
"""
如序列化之后发现显示结果仍然为乱码
1、检查浏览器的默认编码方式是否为 Unicode
2、添加 content_type='application/json; charset=utf-8'
"""
form 表单上传文件及后端如何操作
"""
1、method 必须指定成 post
2、enctype 必须换成 formdata
"""
def file(request):
if request.method == 'POST':
file_obj = request.FILES.get('file')
with open(file_obj.name, 'wb') as f:
for line in file_obj.chunks():
f.write(line)
return render(request, 'file.html')
request对象方法
1、request.method
2、request.GET.get()
3、request.POST.get()
4、request.POST.getlist()
request.GET.getlist()
5、request.path
6、request.path_info
7、request.get_full_path() # 能够获取完整的 url 及后面的参数