【python】-- Django路由系统(网址关系映射)、视图、模板

Django路由系统(网址关系映射)、视图、模板

一、路由系统(网址关系映射)

1、单一路由对应:

一个url对应一个视图函数(类)

urls.py:
url(r‘^test‘, views.test),
#url(r‘^home‘, views.Test.as_view()),

views.py:
def test(request):
    print(request.method)
    return render(request, "home.html")
"""
class Test(View):

    def get(self, request):
        print(request.method)
        return render(request, "home.html")

    def post(self, request):
        print(request.method)
        return render(request, "home.html")
"""

  

 2、基于正则路由对应:

多个url对应一个视图

urls.py
# 多个url对应一个视图函数,不过在给视图函数传参时,要根据对应形参位置进行传参
url(r‘^detail-(\d+)-(\d+).html‘, views.detail),
# 多个url对应一个视图函数,推荐这种写法,在正则匹配完毕后进行了分组分配,在传参时就可以形参位置变化也没有关系
url(r‘^detail-(?P<nid>\d+)-(?P<uid>\d+).html‘, views.detail),

views.py:
#普通传参
def detail(request, nid, uid):
    print(nid, uid)
    return HttpResponse("%s - %s" % (nid, uid))
#args传参
def detail(request, *args, **kwargs):
    print(args[0], args[1])
    return HttpResponse("%s - %s" % (args[0], args[1]))
#kwargs传参
def detail(request, *args, **kwargs):
    print(kwargs["nid"], kwargs["uid"])
    return HttpResponse("%s - %s" % (kwargs["nid"], kwargs["uid"]))

3、name:

对URL路由关系进行命名,以后可以根据此名称生成自己想要的URL

urls.py:
url(r‘^url_1/‘, views.index, name=‘i1‘),
url(r‘^url_2/(\d+)/(\d+)/‘, views.index, name=‘i2‘),
url(r‘^url_3/(?P<pid>\d+)/(?P<nid>\d+)/‘, views.index, name=‘i3‘),

views.py:
from django.urls import reverse
def func(request, *args, **kwargs):
    url1 = reverse(‘i1‘)                              # url_1/
    url2 = reverse(‘i2‘, args=(1,2,))                 # url_2/1/2/
    url3 = reverse(‘i3‘, kwargs={‘pid‘: 1, "nid": 9}) # url_3/1/9/

xxx.html:

    {% url "i1" %}               # url_1/
    {% url "i2" 1 2 %}           # url_2/1/2/
    {% url "i3" pid=1 nid=9 %}   # url_3/1/9/

PS:
    # 显示当前的URL
    request.path_info

4、多级路由:

多级路由目的避免有多个app时,在project urls.py的路由(网址)因路径名称一致而引起的冲突

#project/urls.py:
    from django.conf.urls import url, include
    from django.contrib import admin
    urlpatterns = [
        url(r‘^app1/‘, include("app1.urls")),
        url(r‘^app2/‘, include("app2.urls")),
    ]

#app01/urls.py:
    from django.conf.urls import url
    from app1 import views
    urlpatterns = [
        url(r‘^test‘, views.test),
    ]

#app02/urls.py:
    from django.conf.urls import url
    from app2 import views
    urlpatterns = [
        url(r‘^test‘, views.test),
    ]

5、默认值、命名空间

pass

  

  

二、视图

1、FBV&CBV

1.1、 FBV (Function Base VIew)在view(视图)中基于函数编写逻辑

#urls.py:
url(r‘^test‘, views.test),  # FBV  function base view

#views.py:
def test(request):
    if request.method == "GET":
        return render(request, ‘test.html‘)

1.2、CBV(Class Base Viev)在view(视图)中基于类编写逻辑

#urls.py;
url(r‘^home‘, views.Test.as_view()),  # CBV  class base view   .as_view() Test没有view所以在views.py中Test类中继承Django的View

#views.py:
from django.views import View

class Test(View):

    # 调用父类中的dispatch方法,并重写
    def dispatch(self, request, *args, **kwargs):  # 通过dispatch的反射可以找到如:get、post方法的起始点
        print("before")
        result = super(Test, self).dispatch(request, *args, **kwargs)
        return result

    def get(self, request):
        print(request.method)
        return render(request, "home.html")

    def post(self, request):
        print(request.method)
        return render(request, "home.html")

2、HTML from表单提交数据的提取示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/test" method="POST" enctype="multipart/form-data"><!--enctypes属性没有的话,默认提交的是字符串,无法实现文件上传-->
        <p>
            <input type="text" name="user" placeholder="用户名" />
        </p>
        <p>
            <input type="password" name="pwd" placeholder="密码" />
        </p>
        <p>
            男:<input type="radio"  name="gender" value="1"/>
            女:<input type="radio" name="gender" value="2"/>
            张扬:<input type="radio" name="gender" value="3"/>
        </p>
        <p>
            男:<input type="checkbox"  name="favor" value="11"/>
            女:<input type="checkbox" name="favor" value="22"/>
            张扬:<input type="checkbox" name="favor" value="33"/>
        </p>
        <p>
            <select name="city" multiple>
                <option value="sh">上海</option>
                <option value="bj">北京</option>
                <option value="tj">天津</option>
            </select>
        </p>
        <p>
            <input type="file" name="file"/>
        </p>

        <input type="submit" value="提交"/>
    </form>
</body>
</html>

test.html

def test(request):
    if request.method == "GET":
        return render(request, ‘test.html‘)
    elif request.method == "POST":
        # text
        v = request.POST.get(‘pwd‘)   # 获取input输入框输入的value
        print(v)
        # radio
        v0 = request.POST.get(‘gender‘)   # 获取radio的value
        print(v0)
        # checkbox
        v1 = request.POST.getlist(‘favor‘)   # 获取checkbox多选情况下的value
        print(v1)
        # select
        v2 = request.POST.getlist(‘city‘)   # 获取select下拉框multiple情况下的value
        print(v2)
        # file
        obj = request.FILES.get(‘file‘)    # 获取上传文件并保存
        print(obj, type(obj), obj.name)
        import os
        file_path = os.path.join(‘upload‘, obj.name)
        f = open(file_path, mode="wb")
        for i in obj.chunks():  # chunks()利用生成器,每次只加载部分上传的文件,直至加载完毕
            f.write(i)
        f.close()
        return redirect("/test")
    else:
        # PUT,DELETE,HEAD,OPTION...
        return redirect("/test")

  

三、模板

上一篇博文有粗略概况

pass

  

原文地址:https://www.cnblogs.com/Keep-Ambition/p/8432374.html

时间: 2024-10-23 06:20:40

【python】-- Django路由系统(网址关系映射)、视图、模板的相关文章

第61篇 Django 路由系统 正则表达式和二级路由 路由的命名和反向解析

1. 正则表达式 1. Django路由系统匹配URL路径的时候是从上到下按照注册顺序来的 1.1Django1.11 与Django2.0区别 以及过度转换 2. Django的路由系统只匹配URL路径,不匹配域名.端口.URL参数 3. 分组匹配 --> 相当于给视图函数传位置参数 4. 分组命令匹配 --> 相当于给视图函数传关键字参数 r'^xxxx$' r一定要写上,代表里面的字符串是原始的字符串不需要转译 5. 注意: 分组匹配和分组命名匹配不能混合使用!!! 6.匹配不成功是否自

自动化运维Python系列之Django路由系统、Ajax请求

路由系统 路由系统负责分析处理用户请求网址内容,向后视图函数分发处理任务,根据对应的处理函数处理完成后给用户return模板渲染结果:路由系统分类很多,常见的有基本单一路由,正则路由,带额外参数路由,二层三层路由还有通过反射机制来完成的动态路由. 1)单一路由 url(r'^admin/', admin.site.urls) 2)基于正则的路由 url(r'^detail/(\d+)/', views.detail), url(r'^detail2/(?P<p1>\d+)/(?P<x2&

Django -- 路由系统

Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive), path('articles/<int:year>/<int:month>/<slug:sl

django路由系统

一.路由系统,URL 1.url(r'^index/', views.index), url(r'^home/', views.Home.as_view()), 2.url(r'^detail-(\d+).html', views.detail), 3.url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail) PS: def detail(request, *args,**kwargs): pass 实战: a. ur

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

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

Python笔记——Django路由系统

1.创建Django程序 django-admin startproject mysite 创建project python manage.py startapp app01 创建app01 python manage.py startapp app02 创建app02

Django 路由系统简述

在前面的例子里面,我们已经了解,Django里面可以通过在Project同名的那个目录下的urls.py文件里面配置路由,根据用户输入的url,调用不同的函数或者类的方法.下面看看具体的一些例子. 单一的路由对应关系.这种方式最直接,前面已经多次出现, 可以是fbv或者cbv类型的. url(r'^login/', views.login) url(r'^home/', views.Home.as_view()), 基于正则表达式的路由关系.具体来说,也可以分成两种:a. url(r'^deta

Django models里的关系映射

一.一对一映射 1.什么是一对一 A表中的一条记录只能与B表中的一条记录相关联如:一夫一妻制 2.语法 允许在关联的两个类的任何一个类中 增加: 属性 = models.OneToOneField(Entry) 3.查询 class Wife(models.Model): ... author=models.OneToOneField(Author) 1.正向查询:通过wife 找 author wife = Wife.objects.get(id=1) author = wife.author

Django(二)路由系统、视图、模板

大纲 一.内容概要: 二.上节回顾 三.Django 视图–views  1.获取用户多个数据及文件上传  2.FBV 和 CBV  3.装饰器 四.Django模板补充  - Django模板语言循环字典 五.Django 路由系统  1.一对一:一个url对于一个函数或者一个类  2.1.一对多:一类url对应一个函数或者一个类  2.2.一对多,用法总结  3.name参数  4.url 路由分发机制  5.默认值  6.命名空间 一.内容概要: 1.路由系统——urls 2.视图 3.模