Django之路由层与视图层

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,获取完整路径

原文地址:https://www.cnblogs.com/yanminggang/p/10999781.html

时间: 2024-10-09 23:13:39

Django之路由层与视图层的相关文章

Django的路由层和视图层

django orm中表与表之间建关系            一对多  ForeignKey(to='Publish')                        一对一  OneToOneField(to='AuthorDetail')                        多对多  ManyToManyField(to='Author') 注意:                前面两个关键字会自动再字段后面加_id                最后一个关键字 并不会产生实际字段

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'^$',views.home)

五十六、Django路由层与视图层

一.路由层 1.路由匹配规律 # 网站首页路由:url(r'^$',views.home) # 网站不存在页面:url(r'',views.error) 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路由层与视图层、pycharm虚拟环境

一. Django路由层 路由层即对应项目文件下的urls.py文件.实际上每个APP中也可以有自己的urls.py路由层.templates文件夹及static文件夹.Django支持这么做,也为实际工作中一个项目多人协作完成提供了便利:即每个人单独建一个Django项目写一个APP,最后新建一个Django项目将所有APP汇总,然后settings中注册各个APP,再修改一下其他配置即可. 路由层大致内容如下: from django.conf.urls import url from dj

Django orm关系表的创建 、路由层以及视图层

一.Django 表关系的创建 1.表的对应关系 一对多 多对多 一对一 2.如何判断表的对应关系 利用换位思考的方式,分别站在两张表的角度上去思考 这里比如我们以图书管理系统为例来创建几个简单的表 图书表 出版社表 作者表 为了方便演示,这里我们就强行规定了表之间的关系: 图书和出版社是一对多的外键关系,一对多外键关系 将外键字段建在多的哪一张表上 图书与作者之间是多对多的外键关系,多对多的外键关系 外键字段无论建在那张表都可以,但是推荐你建在查询频率高的那张    表上 作者与作者与作者详情

Django 路由层,视图层,模板层

MVC与MTV模型 一.MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示: 二.MTV Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是: M 代表模型(Mode

Django框架-路由层

Django框架-路由层 一.URL配置(URLconf) 1.基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 2.参数说明 正则表达式:一个正则表达式字符串 views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串 参数:可选的要传递给视图函数的默认参数(字典形式) 别名:一个可选的name参数 二.关于正则表达式(来自官方文档) from dj

Django之路由层

Django之路由层 一 路由的作用 路由即请求地址与视图函数的映射关系,如果把网站比喻为一本书,那路由就好比是这本书的目录,在Django中路由默认配置在urls.py中,如下图: 二 简单的路由配置 # urls.py from django.conf.urls import url # 由一条条映射关系组成的urlpatterns这个列表称之为路由表 urlpatterns = [ url(regex, view, kwargs=None, name=None), # url本质就是一个函

四十七、django路由匹配,分组,反向解析,路由分发,视图层

路由匹配: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^text', views.text), url(r'^testadd', views.testadd), ] 第一个参数是一个正则表达式,也就意味着在路由的匹配的时候,是按照正则匹配的规则去匹配, 路由匹配的顺序是从上往下依次匹配,所有如上两个路由test前面一样,第三个路由一直会匹配不上 正确写法: urlpatterns = [ url(r'^admin/', adm