django 路由层 伪静态网页 虚拟环境 视图层

匿名 (未验证) 提交于 2019-12-02 23:40:02

路由层

  无名分组

  有名分组

  反向解析

  路由分发

  名称空间

伪静态网页

虚拟环境

视图层

  JsonResponse

  FBV与CBV

  文件上传

项目urls.py下面

from app01 import views  urlpatterns = [  url(r'^admin/',admin.site.urls), url(r^$',views.home),        #页面首页 正则匹配路由后面没有后缀 计时只有  就是只要点击127.0.0.1:8000直接显示的页面 url(r'^test/[0-9]{4}',views.test),    #匹配的路由是test/四位数字 然后找到对应的视图函数 url(r'^testadd/$',views.testadd),        #开头和结尾精确匹配才能匹配上 然后找到对应的视图函数 url(r'',views.error)        #这是请求资源不存在的时候返回的对应的参数 ]  #注意:第一个参数是正则表达式,匹配规则按照从上往下依次匹配,匹配到一个之后立即,结束匹配,直接执行对应的视图函数

 #网站首页路由 url(r'^$',views.home)  #网站资源不存在页面 url(r'',views.error)

(将加括号的正则表达式匹配到的内容当做位置参数自动传递给对应的视图函数)

url(r^test/(\d+)/',views.test),    #无名分组 匹配一个或多个数字def test(request,xxx):  print(xxx)  return HttpResponse('test')

有名分组(将加括号的正则表达式匹配到的内容当做关键字参数自动传递给对应的视图函数)

url(r'^test/(?P<year>\d+)',views.test)    #有名分组 匹配一个或多个数字 给视图函数year参数传值  def test(request,year):     print(year)     return HttpResponse('test')

  url(r'^test/(\d+)/(?P<year>\d+)/',views.test)

无名分组多个

url(r^test/(\d+)/(\d+)/',views.test),

有名分组多个

url(r'^test/(?P<year>\d+)/(?P<xxx>\d+)/',views.test,

#项目urls下面路由与视图函数的对应关系 url(r'^test/(\d+)/',views.test,name = 'list'), url(r^index688755/$',views.index,name='index') #可以给每一个路由与视图函数对应关系起一个名字 #这个名字能够唯一标识出对应的路径 #注意这个名字不能重复是唯一的   #前端使用 {% url 'index' %} {% url  '你给路由与视图函数对应关系起的别名' %}  #后端使用 from django.shortcuts import reverse  reverse('index') reverse('你给路由与视图函数对应关系起的别名')

url(r'^test/(\d+)/',views.test,name = list')  #后端使用 print(reverse('list',args=(10,)))  #前端使用 {% url 'list' 10 %}   user_list = models.User.objects.all()  url(r'^edit/(\d+)/',views.endit,name='edit') #前端模板语法 {%for user_obj in user_list%}     <a href ='edit/{{ user_obj.pk}}/'></a> {% endfor %}  #视图函数 form django.shortcuts import reverse def edit(request,edit_id):     url = reverse('edit',args=(edit_id,))  #模板 {% url 'edit' edit_id %}

#后端使用 #后端有名分组和无名分组都可以用这种形式 print(reverse('list',args=(10,)))  #下面这个了解即可 print(reverse('list',kwargs={'year':10}))  #前端使用 #前端有名分组和无名分组都可以用这种形式 {% url 'list' 10%} #下面这了解即可 {% url 'list' year=10 %}

总结:针对有名分组与无名分组的反向解析统一采用一种格式即可

#后端 reverse('list',args=(10,))    #这里的数字通常都是数据的主键值 #前端 {% url 'list' 10 %}  #反向解析的本质:就是获取到一个能够访问名字所对应的视图函数

路由分发

#django每一个app下面都可以由自己的url.py路由层, templates文件夹,static文件夹 #项目名下urls.py(总路由)不再做路由与视图函数的匹配关系而是做路由的分发  from django.conf.urls impout inclue  #路由分发  注意路由分发总路由千万不要$结尾 url(r'^app01/',include(app01_urls)), url(r'^app02/',include(app02_urls))  #在应用下新建urls.py 文件,在该文件内部写路由与视图函数的对应关系即可 form django.conf.urls import url from app01 import views urlpatterns = [ rul(r'^index/',views.index) ]

名称空间(了解)

from django.conf.urls import url,includefrom app01 import urls as app01_urlsfrom app02 import urls as app02_urlsurl(r'^app01/',include(app01_urls,namespace='app01')), url(r'^app02/',include(app02_urls,namespace='app02'))  #加名称空间是因为app里面起别名都是一样的 反向解析后缀识别不出来 app01.urls.py     from django.conf.urls import url     from app01 import views     urlpatterns = [         url(r'^index/',views.index,name='index')     ]  app02.urls.py     from django.conf.urls import url     from app02 import views     urlpatterns = [         url(r'^index/',views.index,name = 'index')     ]  app01.views.py reverse('app01:index')  app02.views.py reverse('app02:index')#第二种 #项目路由里面只需要写url(r'^app01/,include(app01_urls)),app01.url.pyurl(r'^index/',views.index,name='app01_index')app01.views.pyreverse('app01_index')第三种 项目urls里面不用导入  app里面起别名和视图函数里面反转解析和第二种一样项目里直接写url(r'^app01/',include('app01.urls')),url(r'^app02/',include('app02.urls'))  

伪静态网页

#搜索优化seo rul(r'^index.html',views.index,name='app01_index')

虚拟环境

不同的项目配置不同的python解释器

django 1.0与django 2.0之间的区别

#django 2.0 里面的path第一个参数不支持正则,你写什么就匹配什么,100%精准匹配  #django2.0里面的re_path对应的django1.0里面的url

虽然django2.0里面的path不支持正则表达式,但是它提供五个默认的转换器

  str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式

  int,匹配正整数,包含0

  slug,匹配字母、数字以及横杠、下划线组成的字符串。

  path,匹配任何飞空字符串,包含了路径分隔符(/)(不能用?)

自定义转换器

  1正则表达式

  2 类

  3 注册

自定义转换器

from django.urls import path,re_path,register_converterfrom django.shortcuts import  HttpResponse
   class FourDigitYearConverter:         regex = '[0-9]{4}'         def to_python(self, value):             return int(value)         def to_url(self, value):             return '%04d' % value  # 占四位,不够用0填满,超了则就按超了的位数来!     register_converter(FourDigitYearConverter, 'yyyy')     PS:路由匹配到的数据默认都是字符串形式         

FBV与CBV

FBV:基于函数的视图

CBV:基于类的视图

#CBV: url(r^mycls/',views.MyCls.as_views())   from django.views import View clas MyCls(Views):     def get(self,request):         return render(request,'index.html')          def post(self,request):         return HttpResponse('post')

JsonResponse

from django.http import JsonResponse  def index(request):     #res = {'name':'Jsaon帅逼','password':'123'}     #return HttpResponse(jason.dumps(res))   #json默认会给中文编码  ensure_ascii=False 就不会编码了     return JsonRespose({'name':'Jason大帅比','password':'1888888'},json_dumps_params={'ensure_ascii':False})

简单的文件上传

print('path:',request.path) print('full_path:',request.get_full_path())  path:/upload_file/ full_path:/upload_file/?name=jason

前端需要注意的点:

  1 method需要指定成post

  2 enctype需要改为multipart/form-data格式

后端暂时需要注意的是

  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)     

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!