一、无名有名分组的反向解析

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)的更多相关文章

  1. 【django入门教程】Django的安装和入门

    很多初学django的朋友,都不知道如何安装django开发以及django的入门,今天小编就给大家讲讲django入门教程. 注明:python版本为3.3.1.Django版本为1.5.1,操作系 ...

  2. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  3. python学习笔记--Django入门四 管理站点

    上一节  Django入门三 Django 与数据库的交互:数据建模 "管理员界面"是基础功能中的重要部分. django.contrib 包 Django自动管理工具是djang ...

  4. Django 入门

    Django 入门 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模型,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容 ...

  5. Django入门实践(三)

    Django入门实践(三) Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子 ...

  6. Django入门实践(二)

    Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...

  7. Django入门实践(一)

    Django入门实践(一) Django编程思路+入门 认识Django有一个多月了,我觉得学习Django应该先理清它的编程思路.它是典型的MVC框架(在Django里也称MTV),我觉得Djang ...

  8. Django入门笔记

    Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有 ...

  9. Django 入门案例开发(上)

    Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...

随机推荐

  1. 介绍几种给你的Python代码加上酷炫的进度条的方式

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 大家好,在下载某些文件的时候你一定会不时盯着进度条,在写代码的时候使用进度 ...

  2. WAMP3.1 安装php_redis.dll扩展并配置php.ini

    一. 下载对应版本的php_redis.dll 下载地址:http://windows.php.net/downloads/pecl/releases/redis 注:php7目录下有php7.dll ...

  3. @hdu - 5822@ color

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个每个点出度都为 1 的有向连通图以及 m 种颜色.求本质 ...

  4. HTMLTestRunner生成html测试报告

    使用:把文件放到项目某个文件夹中,引入方式如下 import unittest import env import vendor.report.HTMLTestRunnerNew as HTMLTes ...

  5. if test表达式逻辑判断不能用&&

    用&&会报错 用and 例如: <if test="age!=null and name!=null">

  6. 从零开始学习Prometheus监控报警系统

    Prometheus简介 Prometheus是一个开源的监控报警系统,它最初由SoundCloud开发. 2016年,Prometheus被纳入了由谷歌发起的Linux基金会旗下的云原生基金会( C ...

  7. vue 深度拷贝 除去空的参数

    // 去除数组里面为空的属性及子数组 export function deepCopy (source) { var result = [] //var result = {} for (var ke ...

  8. 第三章:软件也要拼脸蛋-UI 开发的点点滴滴

    常用控件 常用控件有:按钮 Button.文本显示框 TextView.图片显示框 ImageView.文本编辑框 EditText.进度条 ProgressBar.提示框 AlertDialog.进 ...

  9. linux网络编程-一个简单的线程池(41)

    有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带来的开销,我们可以使用线程池 1.线程池拥有若干个线程,是线程的集合,线程池中的线程数目有严格的要求,用于执行大量的相对短 ...

  10. vue element安装

    element-ui插件 安装 >: cnpm i element-ui -S main.js配置 import ElementUI from 'element-ui'; import 'ele ...