码迷,mamicode.com
首页 > 其他好文 > 详细

django 路由控制

时间:2020-12-23 12:45:18      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:site   rgb   用户   lazy   知识   代码   默认   home   答案   

django 路由控制

一、路由匹配

  路由控制所对应的py文件是urls.py,它的作用是指路,用户在前端点击对应的按钮,后端能够给前端返回一个对应的页面。当然,视图层也需要正确的视图函数代码才能够返回给前端。

技术图片

  url方法第一个参数是一个正则表达式

  路由匹配按照正则匹配,一旦正则能够匹配到内容,会立刻执行对应的视图函数,不会再继续匹配了

  用户输入url不加最后的斜杠,django会默认自动加上,可以在settings.py配置文件中指定是否开启该功能

APPEND_SLASH = True/False # 开启/关闭

 

 

二、无名分组、有名分组

1、无名分组

  在路由匹配的时候给某段正则表达式加了括号,匹配的时候会将括号内正则表达式匹配到的内容当做位置参数传递给对应的视图函数

# 无名分组
url(r^index/([0-9]{4}), views.index)


# 视图函数
def index(request, args):  # 此处必须传入多传一个参数,来接收无名分组正则匹配到的内容
    print(args)
    return HttpResponse("it‘s index.")

技术图片

 技术图片

 

2、有名分组

  给正则表达式起别名,匹配的时候会将括号内正则表达式匹配到的内容当做关键字参数传递给对应的视图函数

# 有名分组
url(r^index/(?P<yyy>\d+), views.demo)  # 起别名固定格式: ?P<别名>    \d+表示1到多个数字

# 视图函数 def demo(request, yyy): # 传入的参数要与起的别名一致 print(yyy) return HttpResponse("it‘s demo.")

技术图片

技术图片

 

补充:
  无名和有名能否混合使用      答案是:不能!!!!!!!!!!

  虽然不能混合使用,但是用一种命名方式可以使用多个:

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

 

 

三、反向解析

  通过一些方法,能够得到一个结果,该结果可以访问到对应的url

  使用方式:

    先给路由与视图函数对应关系起一个别名:

url(r^test/, views.test),
# 反向解析
url(r^test1/, views.test1, name=aaa),
url(r^test2/, views.test2, name=bbb),
url(r^test3/, views.test3, name=ccc),

    前端解析:

<p><a href="{% url ‘aaa‘ %}">点击跳转到test1页面</a></p>
<p><a href="{% url ‘bbb‘ %}">点击跳转到test2页面</a></p>
<p><a href="{% url ‘ccc‘ %}">点击跳转到test3页面</a></p>

    后端解析:

技术图片
from django.shortcuts import reverse


def test(request):
    return render(request, test.html)


def test1(request):
    _url = reverse(aaa)
    print(_url)
    return HttpResponse("it‘s test1.")


def test2(request):
    _url = reverse(bbb)
    print(_url)
    return HttpResponse("it‘s test2.")


def test3(request):
    _url = reverse(ccc)
    print(_url)
    return HttpResponse("it‘s test3.")
后端解析代码

  截图演示:

技术图片技术图片技术图片

技术图片技术图片技术图片

 

 技术图片技术图片技术图片

 

 

四、无名分组、有名分组反向解析

1、无名分组反向解析

  使用方式:

    先给路由与视图函数对应关系起一个别名

# 无名分组反向解析
url(r^demo1/(\d+)/, views.demo1, name=dem),

    前端解析:

<p><a href="{% url ‘dem‘ 216 %}">点击之后后端输出216</a></p>
<p><a href="{% url ‘dem‘ 111 %}">点击之后后端输出111</a></p>
<p><a href="{% url ‘dem‘ 777 %}">点击之后后端输出777</a></p>

    后端解析:

def demo1(request, xxx):
    _url = reverse(dem, args=(xxx,))  # 获取反向解析的url路径
    print(_url)
    return render(request, demo1.html)

  截图演示:

技术图片技术图片技术图片

技术图片技术图片技术图片

技术图片技术图片技术图片

 

2、有名分组反向解析

  使用方式:

    先给路由与视图函数对应关系起一个别名

url(r^home/(?P<suoyin>\d+)/, views.index, name=hom),

  前端解析:

    第一种写法:无名前端解析写法,推荐使用

<p><a href="{% url ‘hom‘ 216 %}">点击之后后端输出216</a></p><p><a href="{% url ‘hom‘ 111 %}">点击之后后端输出111</a></p>
<p><a href="{% url ‘hom‘ 777 %}">点击之后后端输出777</a></p>

    第二种写法:标准写法,有名前端解析写法

<p><a href="{% url ‘hom‘ suoyin=216 %}">点击之后后端输出216</a></p><p><a href="{% url ‘hom‘ suoyin=111 %}">点击之后后端输出111</a></p>
<p><a href="{% url ‘hom‘ suoyin=777 %}">点击之后后端输出777</a></p>

  后端解析:

    第一种写法:无名分组后端反向解析写法,获取反向解析的url路径

def home(request, suoyin):
    _url = reverse(hom, args=(suoyin,))  # 第一种写法:无名分组后端反向解析写法,获取反向解析的url路径
    print(_url)
    return render(request, home.html)

    第二种写法:有名分组后端反向解析写法,获取反向解析的url路径

def home(request, suoyin):
    _url = reverse(hom, kwargs={"suoyin": 12})  # 第二种写法:有名分组后端反向解析写法,获取反向解析的url路径
    print(_url)
    return render(request, home.html)

  截图演示:

技术图片技术图片技术图片

技术图片技术图片技术图片

技术图片技术图片

技术图片

 

 

五、路由分发

  当django项目比较庞大的时候,路由与视图函数对应关系较多,总路由代码太多冗长,考虑到总路由代码不好维护,django支持每个app都可以有自己的urls.py,并且总路由不再做路由与视图函数的对应关系,而仅仅只做一个分发任务的操作。

  根据请求的不同,识别出当前请求需要访问的功能属于哪个app,然后自动下发到对应app里面的urls.py中,然后由app里面的urls.py做路由与视图函数的匹配。不仅如此,每个app除了可以有自己的urls.py之后,还可以有自己的static文件夹、templates模板文件。

  基于上面的特点,基于django分小组开发,会变得额外的简单。每个人只需要开发自己的app即可,之后只需要创建一个空的django项目,将多个人的app全部拷贝到项目下,配置文件注册、总路由分发一次。

  路由分发需要一个分发的模块:include模块

from django.conf.urls import include

 

路由分发写法

总路由写法(有两种写法):

  第一种:复杂写法

from django.conf.urls import url, include
from django.contrib import admin
from app01 import urls as app01_urls
from app02 import urls as app02_urls


# 第一种:复杂写法
urlpatterns = [
    url(r^admin/, admin.site.urls),
    # 路由分发
    url(r^app01/, include(app01_urls)),
    url(r^app02/, include(app02_urls)),
]

  第二种(推荐使用):简单写法(无需导入app01、app02)

from django.conf.urls import url, include
from django.contrib import admin


# 第二种:简单写法(推荐使用)
urlpatterns = [
    url(r^admin/, admin.site.urls),
    # 路由分发
    url(r^app01/, include(app01.urls)),
    url(r^app02/, include(app02.urls)),
]

  注意事项: ^app01/ 、^app02/ 后面一定不要加 $ 符号

 

子路由:

app01-urls.py:

from django.conf.urls import url
from app01 import views


urlpatterns = [
    url(r^index/, views.index),
    url(r^demo/, views.demo),
    url(r^home/, views.home),
]

app02-urls.py:

from django.conf.urls import url
from app02 import views


urlpatterns = [
    url(r^index/, views.index),
    url(r^demo/, views.demo),
    url(r^home/, views.home),
]

技术图片

 

 

补充知识点

form表单上传文件,后端通过代码获取

  action=""

  method=post

  enctype=formdata

 

前端代码:

<form action="" method="post" enctype="multipart/form-data">
    <p><input type="file" name="myfile"></p>
    <p><input type="submit"></p>
</form>

后端代码:

def upload_files(request):
    if request.method == POST:
        # 获取用户上传的文件
        print(request.FILES)
        file_obj = request.FILES.get(myfile)
        print(file_obj.name)  # 获取文件名
        with open(file_obj.name, wb) as f:
            for i in file_obj:
                f.write(i)
    return render(request, upload_files.html)

技术图片

技术图片

django 路由控制

标签:site   rgb   用户   lazy   知识   代码   默认   home   答案   

原文地址:https://www.cnblogs.com/jsxxd/p/14155780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!