django之路由层与视图层(代码片段)

yanminggang yanminggang     2022-12-18     699

关键词:

Django之路由层与视图层

路由层

urlpatterns = [
    url(r'^admin/',admin.site.urls),
    url(r'^$',views.home),  # 网页首页路由
    url(r'^test/$',views.test),
    url(r'^testadd/$',views.testadd),
    url(r'',views.error)  # 网页不存在页面
]

# 注意:第一个参数是正则表达式,匹配规则按照从上往下依次匹配,匹配到一个之后立即停止,直接执行对应的视图函数

无名分组

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

url(r'^test/(\\d+)/',views.test),  # 匹配一个或多个数字

def test(request,xxx):  # xxx接收正则匹配到的数字
    print(xxx)  # 变量名自己定义
    return HttpResponse('ok')

有名分组

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

url(r'^test/(?P<year>\\d+)',views.test)  # 匹配一个或多个数字

def test(request,year):
    print(year)  # 这里的变量根据路由指定的
    return HttpResponse('ok')

注意:无名分组和有名分组不能混着用,但是支持同一类型多个形式匹配

#无名分组多个
url(r'^test/(\\d+)/(\\d+)',views.test),

#有名分组多个
url(r'^test/(?P<year>\\d+)/(?P<yyy>\\d+)/',views.test)

反向解析

反向解析:根据名字动态获取到对应路径,视图层需要导入模块reverse

#可以给每一个路由与视图函数对应关系起一个名字
#这个名字能够唯一标识出对应的路径
#注意名字不能重复,是唯一的
url(r'^index666/$',views.index,name='index')

from django.shortcuts import reverse
#后端使用
reversr('index')
#也可以
reverse('路由与视图函数对应关系起的别名')

#前端使用
% url 'index' %
#也可以
% url '别名' %

无名分组反向解析

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

#后端使用
reverse('list',args=(10,))  #这边数字可以自定义,可以填数据的主键字段值,方便之后取出编辑

#前段使用
% url 'list' 10 %

编辑简单示例

url(r'^edit/(\\d+)/',views.edit,name='edit')

# 前端
%for user_obj in user_list%
    <a href='edit/ user_obj.pk /'></a>
% endfor %

#后端
from diango.shortcuts import reverse
def edit(request,edit_id):
    url = reverse('edit',args=(edit_id,))
    
#模板
% url 'edit' edit_id %

有名分组反向解析

#后端使用
reverse('list',arge=(10,))
#也可以
reverse('list',kwargs='year':10)  # 了解

#前端使用
% url 'list' 10 %
#也可以
% url 'list' year=10 %  # 了解

总结:针对有名函数和无名函数的反向解析统一采用一种格式即可

#后端
reverse('list',args=(10,))  #这里的数字通常都是数据的主键值

#前端
% url 'list' 10 %

反向解析的本质:就是获取到一个能够访问名字所对应的视图函数

路由分发

简介:django每一个app下都可以有自己的urls.py路由层,templates文件夹,static文件夹,项目名下的urls.py(总路由)不再做路由与视图函数的匹配关系而是做路由的分发

#在路由层导入模块
from django.conf.urls import url,include
from app01 import urls as app01_urls
from app02 import urls as app02_urls

#路由分发,注意路由分发总路由不能以$结尾
url(r'^app01/',include(app01_urls)),  # 防止重名
url(r'^app02/',include(app02_urls))

#也可以不用起别名
url(r'^app01/',include('app01.urls'))
url(r'^app02/',include('app02.urls'))

#在应用下新建urls.py(约定俗成)文件,在该文件内写路由与视图的对应关系即可
from django.conf.urls  import url
from app01 import views
urlpatterns = [
    url(r'^index/',views.index)
]

名称空间(了解)

#总路由
url(r'^app01/',include(app01_urls,namespace='app01')),
url(r'^app02/',include(app02_urls,namespace='app02'))

#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')

#注意:这种了解一下就可以了,不同app中起不同的名字就可以了

伪静态网页

搜索优化seo

url(r'^index.html',views.index,name='app01_index')
#人为加上后缀,让百度误以为是静态网页保存起来,增加搜索概率

虚拟环境

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

创建虚拟环境:

技术图片

技术图片

django1.0与django2.0之间的区别:

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

django2.0的特点

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

  • 1.str,匹配除了路径分隔符(/)之外的非空字符串,这是默认形式
  • 2.int,匹配正整数,包含0
  • 3.slug,匹配字母、数字、以及横杠、下划线组成的字符串
  • 4.uuid,匹配格式化的uuid
  • 5.path,匹配任何非空字符串,包含了路径分隔符(/),不能用(?)

自定义转换器

  • 1.正则表达式
  • 2.类
  • 3.注册
from django.contrib import admin
from django.urls import path,re_path,register_converter

class FourDigitYearConverter:
    regex = '[0-9]4'
    def to_python(self,value):
        return int(value)
    def to_url(self,value):
        return '%04d'%value  #占4位,不够用0填满,超了则按照原来的位数
   
register_converter(FourDigitYearConverter,'yyyy')


urlpatterns = [
    path('admin/',views.site.urls),
    path('index/<yyyy:id>',views.index)
]

#路由匹配到的数据默认都是字符串形式

视图层

FBV与CBV

FBV:基于函数的视图

CBV:基于类的函数

#CBV:
#路由层
urlpatterns = [
    #url(r'^mycls/',views.view),看下图
    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('ok')

技术图片

JsonResponse

JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应

from django.http import JsonResponse

def index(request):
    return JsonResponse('name':'lucas大帅比','password':'123',json_dumps_params='ensure_ascii':False)  # 因为有中文,ensure_ascii保证以原样返回

#json中
print(json.dumps('name':'lucas大帅比','password':'123',ensure_ascii=False))

简单的文件上传

前端form表单中需要注意的点:

  • 1.method需要指定成post
  • 2.enctype需要改为formdata格式,enctype=‘multipart/form-data‘

后端暂时需要注意的是:

  • 1.配置文件中注释掉csrfmiddleware中间件
  • 2.通过request.FILES获取用户上传的post文件数据
def upload_file(request):
    if request.method == '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():
            #for line in file_obj:
                f.write(line)
        return HttpResponse('ok')
    return render(request,'index.html')
print(request.path)  #/upload_file/
print(request.get_full_path())  #/upload_file/?name=lucas,获取完整路径

django路由层与视图层pycharm虚拟环境(代码片段)

一.Django路由层  路由层即对应项目文件下的urls.py文件。实际上每个APP中也可以有自己的urls.py路由层、templates文件夹及static文件夹。Django支持这么做,也为实际工作中一个项目多人协作完成提供了便利:即每个人单独建一个Dja... 查看详情

django之路由层和视图层(代码片段)

一、路由层urlpatterns=[url(r‘^admin/‘,admin.site.urls),url(r‘^$‘,views.home),url(r‘^test/$‘,views.test),url(r‘^testadd/$‘,views.testadd),url(r‘‘,views.error)]#注意:第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个之后立即... 查看详情

django框架之视图层(views)介绍(代码片段)

一、视图层类型1.FBV与CBVFBV:基于函数的视图CBV:基于类的视图(学习重点)#使用CBV时,路由层写法urlpatterns=[#分析源码这里也可写成url(r‘^mycls/‘,views.view),这种格式与FBV路由层中一致url(r‘^mycls/‘,views.MyCls.as_view()),]‘‘‘FBV与C... 查看详情

肆拾陆---django视图层与模板层(代码片段)

django视图层与模板层一、视图层1.1HttpResponse、render、redirect?HttpResponse:返回字符串;?redirect:重定向?render:返回一个html页面,也可以给模板传值?render的逻辑原理:fromdjango.templateimportTemplate,Contextdefindex(request):res=Template('<h1&... 查看详情

django之视图层介绍(代码片段)

1.伪静态设置:路由层:url(‘^index/$‘,views.index),url(‘^article/(?P<id>(\d+)).html/$‘,views.article,name=‘article‘)#只有在正则表达式后面添加".html"就可以成为伪静态的页面文件 2.rquest获取对象‘‘‘1.method:请求方式2.GET:get请求的... 查看详情

django2.0路由补充之path,re_path及视图层(代码片段)

以下是Django2.0版本正则捕获到的参数都是字符串,所以如果函数需要用的其他数据类型,可以在函数中直接转换,也可以在路由中直接转换,如下:下面实例是匹配整数,传过去的参数就是整数fromdjango.urlsimportpath,re_pathpath(‘admi... 查看详情

django之路由层(代码片段)

Django之路由层路由是个啥路由即请求地址与视图函数的映射关系,如果把网站比喻为一本书,那路由就好比是这本书的目录,在Django中路由默认配置在urls.py中,如下图:简单的路由配置#urls.pyfromdjango.conf.urlsimporturl#由一条条映射... 查看详情

django之路由层(代码片段)

Django之路由层一路由的作用路由即请求地址与视图函数的映射关系,如果把网站比喻为一本书,那路由就好比是这本书的目录,在Django中路由默认配置在urls.py中,如下图:二简单的路由配置#urls.pyfromdjango.conf.urlsimporturl#由一条条... 查看详情

django之路由层(代码片段)

Django之路由层一路由的作用路由即请求地址与视图函数的映射关系,如果把网站比喻为一本书,那路由就好比是这本书的目录,在Django中路由默认配置在urls.py中,如下图:二简单的路由配置#urls.pyfromdjango.conf.urlsimporturl#由一条条... 查看详情

django-mtv(代码片段)

知识预览 MTV模型  Django基本命令  视图层之路由配置系统(views)  视图层之视图函数(views)  模板层(template)  模型层基础(model)   模型层进阶(model)  MTV模型Django的MTV分别代表:&nbs... 查看详情

django-mtv(代码片段)

预览MTV模型Django基本命令视图层之路由配置系统视图层之视图函数模板层模型层基础模型层进阶MTV模型Django的MTV分别代表:Model(模型):负责业务对象与数据库的对象(ORM)Template(模板):负责如何把页面展示给用户View(视... 查看详情

django之视图层(代码片段)

请求对象视图函数中request中的常用参数defindex(request):#请求路径print(request.path)#请求路径以及请求参数print(request.get_full_path())#get请求的参数print(request.GET)#post请求的参数print(request.POST)returnHttpResponse(reverse(‘app1:index‘ 查看详情

django之视图层(代码片段)

三板斧"""HttpResponse 返回字符串类型render 返回html页面并且在返回给浏览器之前还可以给html文件传值redirect 重定向"""#视图函数必须要返回一个HttpResponse对象正确研究三者的源码即可得处结论Theviewapp01.views.ind... 查看详情

django之视图层(代码片段)

一、视图函数一个视图函数,简称视图,是一个简单的Python函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片...是任何东西都可以。无论视图本身包含... 查看详情

django基础之路由分发(代码片段)

目录Django之路由层一、路由的作用二、简单的路由配置三、分组四、路由分发Django之路由层一、路由的作用?路由其实就是请求地址与视图函数的映射关系,如果把网站比喻为一本书,那么路由就好比是这本书的目录,在Django中... 查看详情

django入门系列之(视图层)(代码片段)

本文目录1视图函数2HttpRequest对象3HttpResponse对象 4JsonResponse5CBV和FBV6简单文件上传回到目录1视图函数一个视图函数,简称视图,是一个简单的Python函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重... 查看详情

django框架之视图层汇总(代码片段)

1视图函数一个视图函数,简称视图,是一个简单的Python函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片...是任何东西都可以。无论视图本身包含什么... 查看详情

django之视图层(代码片段)

Django之视图层JsonResponseJsonResponse是用来反回json格式的数据的.1.因为要实现前后端分离,那么他就是基于json格式来进行格式传输的.比如后端就专门写接口,前端调用这个接口,就能拿到一个json格式的字符串.然后前端在通过序列化反... 查看详情