Django框架中如何配置特定的路由规则?

2026-05-22 15:441阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1832个文字,预计阅读时间需要8分钟。

Django框架中如何配置特定的路由规则?

Django2.0版本中,实现了以下创新点:

1. 路由分发和命名空间使用:通过使用`url()`函数和`namespace`参数,实现路由的分发和命名空间的定义,使得URL配置更加清晰。

2. 伪静态概念:引入伪静态功能,将动态URL转换为静态URL,提高搜索引擎优化效果。

3. 本地虚拟环境:提供本地虚拟环境搭建,实现项目隔离,避免环境冲突。

4. 前后端数据交互:通过`JsonResponse`类实现前后端数据交互,支持JSON格式数据传输。

5. 文件上传示例:展示了如何使用粒子实现文件上传功能。

本文总结:Django2.0版本是如何实现路由分发和名称空间的使用,伪静态概念以及本地虚拟环境如何使用,前后端如何使用JsonResponse来数据交互,最后演示了一个上传文件的“栗子”,需要就来看看叭~

目录
  • Django 路由
    • 路由分发
    • 名称空间
    • 伪静态
    • 本地虚拟环境
  • Django版本区别
  • JsonResponse
  • 上传文件

Django 路由

每个应用(app)都可以有自己的templates来存放HTML文件,查找顺序是通过app注册的顺序来查找的;

路由分发

django是专注于开发应用的,当一个django项目特别庞大的时候,所有的路由与视图函数映射关系全部写在总的urls.py很明显太冗余不便于管理;

其实django中的每一个应用都可以有自己的urls.py,static文件夹,templates文件夹,基于上述特点,使用django做分组开发非常的简便;

这里的路由分发,类似项目下urls.py是总路由,应用下的urls.py是子路由,这样各司其职,先通过总路由筛选要找的应用,在通过应用的子路由查询对应关系及其对应的视图函数,渲染出不同的页面···

'''总路由分发''' # 方式一 from django.contrib import admin from django.urls import path,re_path,include from app01 import urls as app01_urls from app02 import urls as app02_urls urlpatterns = [ path('admin/', admin.site.urls), # 路由分发 re_path('^app01/',include(app01_urls)), re_path('^app02/',include(app02_urls)) ] '''app01 urls.py''' from django.urls import path,re_path from app01 import views urlpatterns = [ re_path(r'^index/',views.index) ] '''app01 views.py''' def index(request): return HttpResponse('from app01 index') '''app02和app01一样''' # 方式二:不需要导入模块,直接点 re_path('^app01/',include('app01.urls')), re_path('^app02/',include('app02.urls')) 名称空间

名称空间的存在解决了,当多个应用在反向解析使用相同别名的时候,出现了无法自动识别情况

总路由

urlpatterns = [ path('admin/', admin.site.urls), # 路由分发 path('app01/',include(('app01.urls','app01'),namespace='app01')), path('app02/',include(('app02.urls','app02'),namespace='app02')) ]

PS:注意,在使用名称空间的时候,include函数需要传递两个参数,arg和namespace, 当namespace不为空时,arg参数必须是一个二元组,除了urlpatterns不能为空之外,app_name也必须填写

应用

'''app01 urls.py''' from django.urls import path, re_path from app01 import views app_name = 'app01' # 一定要声明应用名 urlpatterns = [ re_path(r'^index/',views.index,name='index'), re_path(r'^login/',views.login), ] '''app01 views.py''' from django.shortcuts import HttpResponse, reverse,render def index(request): return HttpResponse('from app01 index') def login(request): print(reverse('app01:index')) # return HttpResponse('from app01 login') return render(request,'home.html')

<h1>HOME</h1> <a href="{% url 'app01:index' %}">app01</a> <a href="{% url 'app02:index' %}">app02</a> 伪静态

动态网页“伪装”成静态网页,在url中将地址模拟成.html结尾的样子,看上去像似一个静态文件,目的是为了增加搜索引擎收藏我们网站的概率以及SEO查询几率;

Django框架中如何配置特定的路由规则?

本地虚拟环境

在时间开发过程中,我们会给不同的项目配备不同的环境,项目用到什么就装什么,用不到的一概不装,不同的项目解释器环境都不一样;

一般项目都会将项目依赖写入requirements.txt,然后使用pip install -r requirements.txt一次性安装依赖

ps:创建虚拟环境类似于你重新下载了一个纯净的python解释器,如果反复创建类似于反复下载,会消耗一定的硬盘空间

Django版本区别

1.区别 urls.py中的路由匹配方法 django 1.X第一个参数正则表达式 url() django 2.X和3.X第一个参数不支持正则表达式,写什么就匹配什么 path() 如果想要使用正则,那么2.X与3.X也有响应的方法 from django.urls import path,re_path re_path 等价于 1.X里面的url方法 2.转换器 五种常用转换器: str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式 int,匹配正整数,包含0。 slug,匹配字母、数字以及横杠、下划线组成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?) '''总路由''' path('app01/',include(('app01.urls','app01'),namespace='app01')) '''子路由''' path('home/<int:id>',views.home) '''视图函数''' def home(request,id): return HttpResponse('from app01 home')

ps:django1.x拿到的数据都是str,这里的转换器可以将数据类型自动转换;

自定义转换器

class MonthConverter: regex='\d{2}' # 属性名必须为regex def to_python(self, value): return int(value) def to_url(self, value): return value # 匹配的regex是两个数字,返回的结果也必须是两个数字 '''使用自定义转换器''' from django.urls import path,register_converter from app01.path_converts import MonthConverter register_converter(MonthConverter,'mon') from app01 import views urlpatterns = [ path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='aaa'), ] JsonResponse

前后端数据交互,数据格式要求为json格式数据,这里提供了JsonResponse来转换

json模块序列化

def func(request): dic_json = {'name':'Hammer泽','age':18} import json res = json.dumps(dic_json,ensure_ascii=False) return HttpResponse(res)

psensure_ascii=False取消中文自动转码(Unicode),使中文正常显示

JsonResponse模块

JsonResponse底层还是json

def func(request): dic_json = {'name':'Hammer泽','age':18} from django.http import JsonResponse return JsonResponse(dic_json,json_dumps_params={'ensure_ascii':False})

psensure_ascii=False取消中文自动转码(Unicode),使中文正常显示,JsonResponse模块取消转码,需要添加参数json_dumps_params={'ensure_ascii':False}

非字典类型序列化需要添加参数

def func(request): lit_json = [1,2,3,4] from django.http import JsonResponse return JsonResponse(lit_json,json_dumps_params={'ensure_ascii':False},safe=False)

注意:多看源码

上传文件

上传文件注意html页面,form元素的属性需要设置method="post"enctype="multipart/form-data"

# 模拟上传文件 <form action="" enctype="multipart/form-data" method="post"> 上传文件:<input type="file" name="myfile"> <input type="submit" class="btn btn-info"> </form> '''路由''' path('func1/',views.func1) '''视图函数''' def func1(request): if request.method=='POST': file_obj = request.FILES.get('myfile') # 获取到文件对象 print(file_obj.name) # 获取文件的名字 with open(file_obj.name,'wb') as f: for line in file_obj: f.write(line) return render(request,'home.html') '''视图函数使用chunks,相当于迭代器提升效率''' def func1(request): if request.method=='POST': file_obj = request.FILES.get('myfile') # 获取到文件对象 print(file_obj.name) # 获取文件的名字 with open(file_obj.name,'wb') as f: for chunks in file_obj.chunks(): f.write(chunks) return render(request,'home.html')

本文共计1832个文字,预计阅读时间需要8分钟。

Django框架中如何配置特定的路由规则?

Django2.0版本中,实现了以下创新点:

1. 路由分发和命名空间使用:通过使用`url()`函数和`namespace`参数,实现路由的分发和命名空间的定义,使得URL配置更加清晰。

2. 伪静态概念:引入伪静态功能,将动态URL转换为静态URL,提高搜索引擎优化效果。

3. 本地虚拟环境:提供本地虚拟环境搭建,实现项目隔离,避免环境冲突。

4. 前后端数据交互:通过`JsonResponse`类实现前后端数据交互,支持JSON格式数据传输。

5. 文件上传示例:展示了如何使用粒子实现文件上传功能。

本文总结:Django2.0版本是如何实现路由分发和名称空间的使用,伪静态概念以及本地虚拟环境如何使用,前后端如何使用JsonResponse来数据交互,最后演示了一个上传文件的“栗子”,需要就来看看叭~

目录
  • Django 路由
    • 路由分发
    • 名称空间
    • 伪静态
    • 本地虚拟环境
  • Django版本区别
  • JsonResponse
  • 上传文件

Django 路由

每个应用(app)都可以有自己的templates来存放HTML文件,查找顺序是通过app注册的顺序来查找的;

路由分发

django是专注于开发应用的,当一个django项目特别庞大的时候,所有的路由与视图函数映射关系全部写在总的urls.py很明显太冗余不便于管理;

其实django中的每一个应用都可以有自己的urls.py,static文件夹,templates文件夹,基于上述特点,使用django做分组开发非常的简便;

这里的路由分发,类似项目下urls.py是总路由,应用下的urls.py是子路由,这样各司其职,先通过总路由筛选要找的应用,在通过应用的子路由查询对应关系及其对应的视图函数,渲染出不同的页面···

'''总路由分发''' # 方式一 from django.contrib import admin from django.urls import path,re_path,include from app01 import urls as app01_urls from app02 import urls as app02_urls urlpatterns = [ path('admin/', admin.site.urls), # 路由分发 re_path('^app01/',include(app01_urls)), re_path('^app02/',include(app02_urls)) ] '''app01 urls.py''' from django.urls import path,re_path from app01 import views urlpatterns = [ re_path(r'^index/',views.index) ] '''app01 views.py''' def index(request): return HttpResponse('from app01 index') '''app02和app01一样''' # 方式二:不需要导入模块,直接点 re_path('^app01/',include('app01.urls')), re_path('^app02/',include('app02.urls')) 名称空间

名称空间的存在解决了,当多个应用在反向解析使用相同别名的时候,出现了无法自动识别情况

总路由

urlpatterns = [ path('admin/', admin.site.urls), # 路由分发 path('app01/',include(('app01.urls','app01'),namespace='app01')), path('app02/',include(('app02.urls','app02'),namespace='app02')) ]

PS:注意,在使用名称空间的时候,include函数需要传递两个参数,arg和namespace, 当namespace不为空时,arg参数必须是一个二元组,除了urlpatterns不能为空之外,app_name也必须填写

应用

'''app01 urls.py''' from django.urls import path, re_path from app01 import views app_name = 'app01' # 一定要声明应用名 urlpatterns = [ re_path(r'^index/',views.index,name='index'), re_path(r'^login/',views.login), ] '''app01 views.py''' from django.shortcuts import HttpResponse, reverse,render def index(request): return HttpResponse('from app01 index') def login(request): print(reverse('app01:index')) # return HttpResponse('from app01 login') return render(request,'home.html')

<h1>HOME</h1> <a href="{% url 'app01:index' %}">app01</a> <a href="{% url 'app02:index' %}">app02</a> 伪静态

动态网页“伪装”成静态网页,在url中将地址模拟成.html结尾的样子,看上去像似一个静态文件,目的是为了增加搜索引擎收藏我们网站的概率以及SEO查询几率;

Django框架中如何配置特定的路由规则?

本地虚拟环境

在时间开发过程中,我们会给不同的项目配备不同的环境,项目用到什么就装什么,用不到的一概不装,不同的项目解释器环境都不一样;

一般项目都会将项目依赖写入requirements.txt,然后使用pip install -r requirements.txt一次性安装依赖

ps:创建虚拟环境类似于你重新下载了一个纯净的python解释器,如果反复创建类似于反复下载,会消耗一定的硬盘空间

Django版本区别

1.区别 urls.py中的路由匹配方法 django 1.X第一个参数正则表达式 url() django 2.X和3.X第一个参数不支持正则表达式,写什么就匹配什么 path() 如果想要使用正则,那么2.X与3.X也有响应的方法 from django.urls import path,re_path re_path 等价于 1.X里面的url方法 2.转换器 五种常用转换器: str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式 int,匹配正整数,包含0。 slug,匹配字母、数字以及横杠、下划线组成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?) '''总路由''' path('app01/',include(('app01.urls','app01'),namespace='app01')) '''子路由''' path('home/<int:id>',views.home) '''视图函数''' def home(request,id): return HttpResponse('from app01 home')

ps:django1.x拿到的数据都是str,这里的转换器可以将数据类型自动转换;

自定义转换器

class MonthConverter: regex='\d{2}' # 属性名必须为regex def to_python(self, value): return int(value) def to_url(self, value): return value # 匹配的regex是两个数字,返回的结果也必须是两个数字 '''使用自定义转换器''' from django.urls import path,register_converter from app01.path_converts import MonthConverter register_converter(MonthConverter,'mon') from app01 import views urlpatterns = [ path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='aaa'), ] JsonResponse

前后端数据交互,数据格式要求为json格式数据,这里提供了JsonResponse来转换

json模块序列化

def func(request): dic_json = {'name':'Hammer泽','age':18} import json res = json.dumps(dic_json,ensure_ascii=False) return HttpResponse(res)

psensure_ascii=False取消中文自动转码(Unicode),使中文正常显示

JsonResponse模块

JsonResponse底层还是json

def func(request): dic_json = {'name':'Hammer泽','age':18} from django.http import JsonResponse return JsonResponse(dic_json,json_dumps_params={'ensure_ascii':False})

psensure_ascii=False取消中文自动转码(Unicode),使中文正常显示,JsonResponse模块取消转码,需要添加参数json_dumps_params={'ensure_ascii':False}

非字典类型序列化需要添加参数

def func(request): lit_json = [1,2,3,4] from django.http import JsonResponse return JsonResponse(lit_json,json_dumps_params={'ensure_ascii':False},safe=False)

注意:多看源码

上传文件

上传文件注意html页面,form元素的属性需要设置method="post"enctype="multipart/form-data"

# 模拟上传文件 <form action="" enctype="multipart/form-data" method="post"> 上传文件:<input type="file" name="myfile"> <input type="submit" class="btn btn-info"> </form> '''路由''' path('func1/',views.func1) '''视图函数''' def func1(request): if request.method=='POST': file_obj = request.FILES.get('myfile') # 获取到文件对象 print(file_obj.name) # 获取文件的名字 with open(file_obj.name,'wb') as f: for line in file_obj: f.write(line) return render(request,'home.html') '''视图函数使用chunks,相当于迭代器提升效率''' def func1(request): if request.method=='POST': file_obj = request.FILES.get('myfile') # 获取到文件对象 print(file_obj.name) # 获取文件的名字 with open(file_obj.name,'wb') as f: for chunks in file_obj.chunks(): f.write(chunks) return render(request,'home.html')