day62 django入门(3)
一、无名有名分组的反向解析
1 无名分组的反向解析
# 先回顾一下之前的概念
# 什么是无名分组,怎么用?
# 在urls.py中配置路由的时候
url(r'^edit/(\d+/)',views.edit_user) # 在views中的edit_user函数会接收到url传来的位置参数,此参数为d+匹配到的内容
# 什么是反向解析,怎么用?
# 在urls.py中配置路由的时候
url(r'^edit/',views.edit_user,name='aaa')
# 就是给某个url和视图函数的绑定关系起一个别名,以后即使修改url也不会影响其他地方的代码
# 无名分组和反向解析连用
url(r'^edit/(\d+)/',views.edit_user,name='edit')
# 此处的应用场景比如我们之前在修改用户的时候,传给修改页面是手动写的?id=xxx,此处d+的匹配可以让我们更方便的实现修改功能
# 前端修改前
<a href="/edit/?id={{ obj.id }}" class="btn-xs btn-success">编辑</a>
# 前端修改后
<a href="{% url 'edit' obj.id %} " class="btn-xs btn-success">编辑</a>
# 后端修改前
def edit_user(request):
id = request.GET.get('id')
edit_obj = models.Author.objects.filter(id=id).first()
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
models.Author.objects.filter(id=id).update(username=username,password=password)
return redirect('/userlist/')
return render(request,'edit.html',locals())
# 后端修改后,区别就在于一个是需要get请求得到拼接提交的值,而无名分组的反向解析
def edit_user(request,edit_id):
edit_obj = models.Author.objects.filter(id=edit_id).first()
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
models.Author.objects.filter(id=edit_id).update(username=username,password=password)
return redirect('/userlist/')
return render(request,'edit.html',locals())
2 有名分组的反向解析
django为了编辑者的方便有名分组也可以使用无名分组反向解析一样的方式,只是在传参的时候换成关键字参数即可
二、路由分发
django为了每一个应用可以分开进行编程,每一个应用都可以有自己对应的templates文件夹,urls.py static文件夹。基于这种特点,可以更好的做到分组开发。组长只要把每个人写的app整合到一个django项目中即可,然后再配置文件里面注册索引的app,再利用路由分发的特点把所有的app整合起来。
路由分发就是以一个app为单位进行对应关系的绑定。
# 总路由
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 1.路由分发
url(r'^app01/',include(app01_urls)), # 只要url前缀是app01开头 全部交给app01处理
url(r'^app02/',include(app02_urls)) # 只要url前缀是app02开头 全部交给app02处理
# 2.终极写法 推荐使用
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
# 注意事项:总路由里面的url千万不能加$结尾
]
# 子路由
# app01 urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^reg/',views.reg)
]
# app02 urls.py
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^reg/',views.reg)
]
三、名称空间(了解)
当我们进行路由分发的时候,如果出现app01和app02里面给一个绑定关系起了同一个别名。这个时候,进行反向解析就会只能找到放在前面的url,这时候就用到了名称空间。
# 总路由
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
url(r'^app02/',include('app02.urls',namespace='app02'))
# 解析的时候
# app01
urlpatterns = [
url(r'^reg/',views.reg,name='reg')
]
# app02
urlpatterns = [
url(r'^reg/',views.reg,name='reg')
]
reverse('app01:reg')
reverse('app02:reg')
{% url 'app01:reg' %}
{% url 'app02:reg' %}
# 其实只要保证名次不冲突,就没必要使用名称空间
# 通常遇到可能会重名的情况也是直接加上app的前缀
urlpatterns = [
url(r'^reg/',views.reg,name='app01_reg')
]
urlpatterns = [
url(r'^reg/',views.reg,name='app02_reg')
]
四、伪静态(了解)
就是把一个动态网页伪装成静态网页
比如:https://www.cnblogs.com/Dominic-Ji/p/9234099.html
以html为结尾可以伪装成静态页面
伪装的目的是可以增大本网站的seo查询力度,并且增加搜索引擎收藏本网站的概率。
搜索引擎本质上是一个巨大的爬虫程序。
urlpatterns = [
url(r'^reg.html',views.reg,name='app02_reg')
]
五、虚拟环境(了解)
在正常的开发中,我们会给一个项目配备一个这个项目该有的解释器环境,这个环境只有这个项目用得到的模块,其他模块一概不装。
这样可以减轻解释器压力,因为在开启一个项目的时候,会把所有的模块都加载一遍。
在以后开发的过程中,为了避免不同模块不同版本的兼容问题,通常会配备一个requirements.txt文件,里面装了这个项目所有的模块和版本,一键安装即可。
六、django版本区别
1 url的区别
django1.X路由层使用的是url方法,2.X和3.X版本路由层使用的是path方法
url()第一个参数支持正则,path()的第一个参数不支持正则,些什么就匹配什么
# 在2.X中如果想让path第一个参数匹配正则也有办法
from django.urls import path,re_path
from django.conf.urls import url
re_path(r'^index/',index),
url(r'^login/',login)
2 path虽然不支持正则,但是它内部支持五种转换器
# 第一种转换器
path('index/<int:id>/',views.index)
def index(request,id):
...
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
3 path除了有默认的五个转换器之外,还支持自定义转换器(了解)
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'),
]
七、视图层
1 三板斧
"""
HttpResponse
返回字符串类型
render
返回html页面 并且在返回给浏览器之前还可以给html文件传值
redirect
重定向
如果我们一个视图函数没有返回值的话会报如下错误
The view app01.views.index didn't return an HttpResponse object. It returned None instead.
在点击三板斧的源码,我们会发现最后都是HttpResponse对象,所以视图函数必须要返回HttpResponse对象
"""
# render简单内部原理
from django.template import Template,Context
res = Template('<h1>{{ user }}</h1>')
con = Context({'user':{'username':'jason','password':123}})
ret = res.render(con)
print(ret)
return HttpResponse(ret)
2 jsonResponse对象
json格式的数据可以跨语言交互,前后端数据交互需要使用到json作为过渡。
前端序列化-后端序列化
JSON.stringify() - json.dumps()
JSON.parse() - json.loads()
# 在视图函数中,我们要把一个字符串的数据转换成json数据,然后传递给前端
import json
from django.http import JsonResponse
def ab_json(request):
user_dict = {'username':'黄钊123','password':'123','hobby':'girl'}
# json模块方式,ensure_ascii=False在dumps里默认是True,默认不显示中文字符
json_str = json.dumps(user_dict,ensure_ascii=False)
return HttpRespone(json_str)
# JsonResponse模块方式
# 读源码可以知道,本质上还是用json实现的,只是加了一些其他的功能
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
# 默认只能序列化字典,序列化其他需要加safe参数
# return JsonResponse(l,safe=False)
3 form表单上传文件及后端如何操作
"""
form表单上传文件类型的数据
1.method必须指定成post
2.enctype必须换成formdata
"""
def ab_file(request):
if request.method == 'POST':
# print(request.POST) # 只能获取普通的简直对数据 文件不行
print(request.FILES) # 获取文件数据
# <MultiValueDict: {'file': [<InMemoryUploadedFile: u=1288812541,1979816195&fm=26&gp=0.jpg (image/jpeg)>]}>
file_obj = request.FILES.get('file') # 文件对象
print(file_obj.name)
with open(file_obj.name,'wb') as f:
for line in file_obj.chunks(): # 推荐加上chunks方法 其实跟不加是一样的都是一行行的读取
f.write(line)
return render(request,'form.html')
4 request对象方法
"""
request.method
request.POST
request.GET
request.FILES
request.body # 原生的浏览器发过来的二进制数据 后面详细的讲
request.path 获取不带参数的url
request.path_info 获取不带参数的url
request.get_full_path() 能过获取完整的url及问号后面的参数
"""
print(request.path) # /app01/ab_file/
print(request.path_info) # /app01/ab_file/
print(request.get_full_path()) # /app01/ab_file/?username=jason
5 FBV与CBV
function base views
class base views
# CBV路由
url(r'^login/',views.MyLogin.as_view())
from django.views import View
class MyLogin(View):
def get(self,request):
return render(request,'form.html')
def post(self,request):
return HttpResponse('post方法')
# CBV可以根据不同的请求直接匹配到不同的方法去执行
day62 django入门(3)的更多相关文章
- 【django入门教程】Django的安装和入门
很多初学django的朋友,都不知道如何安装django开发以及django的入门,今天小编就给大家讲讲django入门教程. 注明:python版本为3.3.1.Django版本为1.5.1,操作系 ...
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- python学习笔记--Django入门四 管理站点
上一节 Django入门三 Django 与数据库的交互:数据建模 "管理员界面"是基础功能中的重要部分. django.contrib 包 Django自动管理工具是djang ...
- Django 入门
Django 入门 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模型,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容 ...
- Django入门实践(三)
Django入门实践(三) Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子 ...
- Django入门实践(二)
Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...
- Django入门实践(一)
Django入门实践(一) Django编程思路+入门 认识Django有一个多月了,我觉得学习Django应该先理清它的编程思路.它是典型的MVC框架(在Django里也称MTV),我觉得Djang ...
- Django入门笔记
Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有 ...
- Django 入门案例开发(上)
Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...
随机推荐
- 架构C02-商业模式与架构设计
商业模式与架构设计:A段架构与B段架构 <思考软件创新设计:A段架构师思考技术> A段架构师必须具备鲜活的创新思维,睿智的策略思考,犀利的洞察力和灵活的战术才能把握稍纵即逝的商机 ...
- 利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载
利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载 1.页面显示代码 <%@ page language="java" import="java ...
- 【asp.net core 系列】9 实战之 UnitOfWork以及自定义代码生成
0. 前言 在前一篇中我们创建了一个基于EF的数据查询接口实现基类,这一篇我将带领大家讲一下为这EF补充一些功能,并且提供一个解决避免写大量配置类的方案. 1. SaveChanges的外移 在之前介 ...
- TensorFlow从0到1之TensorFlow超参数及其调整(24)
正如你目前所看到的,神经网络的性能非常依赖超参数.因此,了解这些参数如何影响网络变得至关重要. 常见的超参数是学习率.正则化器.正则化系数.隐藏层的维数.初始权重值,甚至选择什么样的优化器优化权重和偏 ...
- 使用python求解向量值函数的雅各比(Jacobian)矩阵
考虑一个向量值函数$R^m \rightarrow R^n$,即$\textbf{y} = f(\textbf{x})$,它的雅各比(Jacobian)矩阵定义如下. 下面记录下一段使用python求 ...
- 如何在VMware虚拟机中安装CentOS6.7系统(上篇)
之前给大家分享了在VMware中如何创建CentOS虚拟机,今天给大家分享一下如何在虚拟机中安装CentOS系统,以CentOS6.7系统为例,其他的系统版本也可以参考该教程进行类似处理,具体的流程如 ...
- cb08a_c++_顺序容器的操作1
cb08a_c++_顺序容器的操作1容器定义的类型别名begin(闭区间)和end(开区间)成员{first,last)左闭右开,左包括,右不包括,end()指向最后一个的下一个. /*cb08a_c ...
- Jenkins自动化测试脚本的构建
[准备环境] 自动化测试框架脚本 Linux下的Python环境 https://www.cnblogs.com/xinhua19/p/12836522.html [思路] 测试顺序是,测试通过 ...
- django xadmin 配置过程
1.拷贝xadmin的一个下的一个xadmin文件夹放到项目里
- Nginx具体配置(三)
一:Nginx配置实例 - 反向代理 实例一: 1.1:实现效果 在Windows浏览器地址栏中输入www.123.com,跳转到Linux系统中的tomcat主页面 访问Nginx:192.168. ...