Django路由层与视图层

本文深入探讨Django框架中的路由匹配原理,包括正则表达式的使用、路由顺序、特殊字符的作用,以及如何通过有名分组和无名分组传递参数给视图函数。同时,介绍了反向解析的实现方式及其在前端跳转和后端重定向中的应用,以及路由分发和名称空间的概念。此外,还讲解了视图层的JSONResponse、FBV与CBV的区别,以及文件上传的前后端处理技巧。

路由层

路由匹配问题

urlpatterns = [
				url(r'test',views.test),
				url(r'testother',views.testadd),
			]

问题1:输入testother出现的页面仍然是test的页面:

这是因为url的第一个参数是正则表达式,也就意味着在路由匹配的时候按照正则匹配规则进行匹配。路由匹配的顺序是从上至下依次匹配,匹配到一个之后就会立刻执行对应函数不再继续往下匹配。

解决方法:最后加个斜杠

问题2:前面加乱码,最后加乱码依旧能找到页面

解决方法:开头加^,最后加$

模板

urlpatterns = [
				url(r'^admin/', admin.site.urls),
				url(r'^$',views.home),  # 网站首页路由
				url(r'^test/$',views.test),
				url(r'^testother/$',views.testadd),
				url(r'',views.error)  # 报错404路由
			]

路由特别多的时候,我们要考虑路由的位置或是斟酌路由名称。

无名分组

正则匹配成功会调用视图函数,我们并没有给函数加括号,这是因为Django内部会自动加括号,并且传了一个request参数,如果我们想要把正则表达式也传递给视图函数,在视图函数中加一个位置形参。

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

url(r'^test/(\d+)/',views.test),  # \d+匹配一个或多个数字
		
def test(request,xxx):
    print(xxx)
    return HttpResponse('test')

有名分组

有名函数:将加括号的正则表达式匹配到的内容当做关键字参数自动传递给相应的视图函数。

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

def test(request,example):
    print(example)
    return HttpResponse('test')

总结

  1. 有名分组和无名分组无法混合使用
  2. 支持同一类型分组多个形式匹配无名分组或有名分组可以写多个

反向解析

根据名字动态获取到对应路径

应用场景:前端标签跳转页面,或者后端视图函数(redirect重定向页面),需要找到urls下的路由,若路由更改,则修改工程巨大。

使用方法

from django.shortcuts import reverse
# 为路由与视图函数对应关系起个名字,唯一标识对应路径,名字不可重复
url(r'^indexluan/$',views.index,name='index')  
前端使用

{% url '你给路由与视图函数对应关系起的别名' %}

后端使用

reverse('你给路由与视图函数对应关系起的别名')

无名分组反向解析

url(r'^test/(\d+)/',views.test,name='example')
# 后端使用
reverse('example',args=(加括号匹配到的内容,))
# 前端使用
{% url '你给路由与视图函数对应关系起的别名' 需传递的值 %}

有名分组反向解析

后端使用
# 后端有名分组和无名分组都可以用这种形式
reverse('example',args=(加括号匹配到的内容,))
# 下面这个了解即可
reverse('example',kwargs={加括号匹配到的内容('关键字参数':)})
前端使用
# 前端有名分组和无名分组都可以用这种形式
{% url 'example' 需传递的值 %}
# 下面这个了解即可
{% url 'example' 需传递的值(关键字参数=) %}

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

路由分发

Django每一个app下面都可以有自己的urls.py路由层,templates文件夹,static文件夹

项目名下的urls.py(总路由)不再做路由和视图函数的匹配关系,而是做路由的分发

from django.conf.urls import include

# 路由分发  注意路由分发总路由千万不要$结尾
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')

伪静态网页

搜索优化seo

url(r'^index.html',views.index,name='app01_index')

虚拟环境

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

django1.0与django2.0之间的区别
django2.0里面的path第一个参数不支持正则,你写什么就匹配,100%精准匹配

django2.0里面的re_path对应着django1.0里面的url

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

​ str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
​ int,匹配正整数,包含0。
​ slug,匹配字母、数字以及横杠、下划线组成的字符串。
​ uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
​ path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

自定义转换器
1.正则表达式
2.类
3.注册

# 自定义转换器
class FourDigitYearConverter:
	regex = '[0-9]{4}'
	def to_python(self, value):
		return int(value)
	def to_url(self, value):
		return '%04d' % value  # 占四位,不够用0填满,超了则就按超了的位数来!
register_converter(FourDigitYearConverter, 'yyyy')
# PS:路由匹配到的数据默认都是字符串形式

视图层

JsonReponse

from django.http import JsonResponse
	def index(request):
		# res = {'name':'Jason大帅比','password':18}
		# return HttpResponse(json.dumps(res))
		return JsonResponse({'name':'Jason大帅比','password':'1888888'},json_dumps_params={'ensure_ascii':False})
	
	print('path:',request.path)
    print('full_path:',request.get_full_path())
	
	path: /upload_file/
	full_path: /upload_file/?name=jason

FBV与CBV

  • FBV:基于函数的视图
  • CBV:基于类的视图
CBV:
    urlpatterns = [
        # url(r'^mycls/',views.view)
        url(r'^mycls/',views.MyCls.as_view())  # as_view()返回view,views.MyCls.as_view()等同于views.view,无论是FBV还是CBV路由层都是路由对应视图函数内存地址
    ]

    class MyCls(View):
        def get(self,request):
            return render(request,'index.html')
        def post(self,request):
            return HttpResponse('post')

文件上传

前端需要注意的点:
1.method需要指定成post
2.enctype需要改为formdata格式

后端暂时需要注意的是
1.配置文件中注释掉csrfmiddleware中间件
2.通过request.FILES获取用户上传的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():
            f.write(line)
【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念分析方法;②掌握利用Simulink进行电力系统建模仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
本研究聚焦于运用MATLAB平台,将支持向量机(SVM)应用于数据预测任务,并引入粒子群优化(PSO)算法对模型的关键参数进行自动调优。该研究属于机器学习领域的典型实践,其核心在于利用SVM构建分类模型,同时借助PSO的全局搜索能力,高效确定SVM的最优超参数配置,从而显著增强模型的整体预测效能。 支持向量机作为一种经典的监督学习方法,其基本原理是通过在高维特征空间中构造一个具有最大间隔的决策边界,以实现对样本数据的分类或回归分析。该算法擅长处理小规模样本集、非线性关系以及高维度特征识别问题,其有效性源于通过核函数将原始数据映射至更高维的空间,使得原本复杂的分类问题变得线性可分。 粒子群优化算法是一种模拟鸟群社会行为的群体智能优化技术。在该算法框架下,每个潜在解被视作一个“粒子”,粒子群在解空间中协同搜索,通过不断迭代更新自身速度位置,并参考个体历史最优解和群体全局最优解的信息,逐步逼近问题的最优解。在本应用中,PSO被专门用于搜寻SVM中影响模型性能的两个关键参数——正则化参数C核函数参数γ的最优组合。 项目所提供的实现代码涵盖了从数据加载、预处理(如标准化处理)、基础SVM模型构建到PSO优化流程的完整步骤。优化过程会针对不同的核函数(例如线性核、多项式核及径向基函数核等)进行参数寻优,并系统评估优化前后模型性能的差异。性能对比通常基于准确率、精确率、召回率及F1分数等多项分类指标展开,从而定量验证PSO算法在提升SVM模型分类能力方面的实际效果。 本研究通过一个具体的MATLAB实现案例,旨在演示如何将全局优化算法机器学习模型相结合,以解决模型参数选择这一关键问题。通过此实践,研究者不仅能够深入理解SVM的工作原理,还能掌握利用智能优化技术提升模型泛化性能的有效方法,这对于机器学习在实际问题中的应用具有重要的参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值