路由层
路由层的基本格式
from django.conf.urls import url
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
参数说明
- 正则表达式:一个正则表达式字符串
- views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 参数:可选的要传递给视图函数的默认参数(字典形式)
- 别名:一个可选的name参数
路由层的匹配规则
-
第一个参数是正则表达式,
-
匹配规则按照从上往下一次匹配,
-
匹配到一个之后立即匹配,直接执行对应的视图函数
为了防止不规则的URL地址推荐在正则表达式里面写^$
常用的网站的路由
网站首页路由
url(r'^$',views.home)
网站不存在页面
url(r'',views.error)
无名分组
来看下面的URLS
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^test/(d+)/',views.test),
]
对应的VIEWS
def test(request,pos):
print(pos)
return HttpResponse('test')
pos是路由匹配到的正则表达式里面的数据,通过位置参数传递给队形的test视图。
有名分组
对应的URLS
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^test/(?P<year>d+)/',views.test),
]
对应的VIEWS
def test(request, year):
print(year)
return HttpResponse('test')
有名分组语法是?P<name>
是给正则匹配到的参数取得名字,通过关键字 参数传递给后端程序,
注意:无名分组和有名分组不能混着用!!!
反向解析(根据名字动态获取到对应路径)
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^index6668888/$',views.index,name='index'),
]
注意:
- 可以给每一个路由与视图函数对应关系起一个名字
- 这个名字能够唯一标识出对应的路径
- 注意这个名字不能重复是唯一的
后端使用
from django.shortcuts import reverse
reverse('index') # index是在路由里面起的别名
无名分组反向解析
视图层
url(r'^test/(d+)/',views.test,name='list')
后端
print(reverse('list',args=(10,)))
前端使用
{% url 'list' 10 %}
因为有无名分组的语法存在,如果在传递参数的时候没有按照无名分组里面的规则传递参数,那么就会报错,这个时候按照路由规则,我们在后端的reverse里面传入一个参数,数字可以随意写,args = 10 符合d+
的路由规则
应用
在操作数据的时候可以不用写数字而是根据不同的数据动态生成数据。
ORM
user_list = models.User.objects.all()
后端
url(r'^edit/(d+)/',views.edit,name='edit')
前端模板语法
{%for user_obj in user_list%}
<a href='edit/{{ user_obj.pk }}/'></a>
{% endfor %}
视图函数
from django.shortcuts import reverse
def edit(request,edit_id):
url = reverse('edit',args=(edit_id,))
模板
{% url 'edit' edit_id %}
路由分发
在项目文件的settings文件中url不在做具体的路由匹配,而是要做路由分发,把不同路径的请求交给不同的应用处理
这里我们这里新建两个APP app01和app01并且在settings文件中配置上
from app01 import urls as app01_urls
from app02 import urls as app02_urls
from django.conf.urls import include
# 路由分发 注意路由分发总路由千万不要$结尾
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls)
如果应用重名并且应用了反向解析,那么Django不能识别出来是应用的同名请求
名称空间(了解) 在同名的时候可以在url中利用名称空间区分不同的函数
url(r'^app01/',include(app01_urls,namespace='app01')),
url(r'^app02/',include(app02_urls,namespace='app02'))
最终的路由分发格式
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls')),
是利用importlib
函数将app01.urls
转换成标准格式
伪静态页面
url(r'^index.html',views.index,name='app01_index')
CBA与VBA
路由层
url(r'^mycls/',views.MyCls.as_view())
视图层
class MyCls(View):
def get(self,request):
return render(request,'index.html')
def post(self,request):
return HttpResponse('post')
JsonResponse
让Json部转码中文文字符
from django.http import JsonResponse
def index(request):
return JsonResponse({'name':'Jason大帅比','password':'1888888'},json_dumps_params={'ensure_ascii':False})
简单的文件上传
前端
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="my_file">
<input type="submit">
</form>
后端
后端暂时需要注意的是
1.配置文件中注释掉csrfmiddleware中间件
2.通过request.FILES获取用户上传的post文件数据
file_obj = request.FILES.get('my_file')
print(file_obj.name)
with open(file_obj.name,'wb') as f:
for line in file_obj.chunks():
f.write(line)
path: /upload_file/ 在上传文件的同时不能携带参数
full_path: /upload_file/?name=jason 上传文件的时候也可以上传文件
conda remove --prefix=C:UsersKingAppDataLocalcondacondaenvspy2 --all
conda create --name py2 python=2.7
conda config --append channels https://conda.anaconda.org/conda-forge/win-64
conda config --append channels https://conda.anaconda.org/conda-forge/noarch