day 67 Django的view 与路由
一、Django中的视图
CBV和FBV
我们之前写过的都是基于函数的view,就叫FBV。还可以把view写成基于类的。
url(r'^add_publisher/',views.AddPublisher.as_view)

在views里添加
from django.views import View
class AddPublisher(View):
def get(self, request):
return render(request, 'add_publisher.html')
def post(self,request):
new_name =request.POST.get('publisher_name',None)
if new_name:
models.Publisher.objects.create(name=new_name)
else:
error_msg ="出版社名称不存在"
return render(request,'add_publisher.html',{'error':error_msg})

Request对象
请求相关的常用值
- path_info 返回用户访问url,不包括域名
- method 请求中使用的HTTP方法的字符串表示,全大写表示。
- GET 包含所有HTTP GET参数的类字典对象
- POST 包含所有HTTP POST参数的类字典对象
- body 请求体,byte类型 request.POST的数据就是从body里面提取到的
2. request对象
1. 之前学过的
1. request.method --> 获取请求的方法(GET、POST等)
2. request.GET --> 通常用来获取URL里面的参数
127.0.0.1:8000/edit_book/?id=1&name=yimi
request.GET --> {"id":1, "name":"yimi"}
request.GET.get("id")
3. request.POST --> 用来获取POST提交过来的数据
request.POST.get("book_name")
2. 补充其他常用的:
1. request.path_info --> 获取用户请求的路径(不包含IP和端口和URL参数)
2. request.body
3. response
基础必备三件套(求学要严谨)
1. HttpResponse --> 返回字符串内容
2. render --> 返回一个html页面
3. redirect --> 返回一个重定向(告诉浏览器再去访问另外的网址)
4. JsonResponse
三、Response对象
与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。
html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>upload</title>
</head>
<body> <form action="/upload/" method="post" enctype="multipart/form-data">
<input type="file" name="upload_file">
<input type="submit" value="开始上传"> </form>
</body>
</html>
url(r'^upload/',views.upload)
views文件
下面def upload(request):
if request.method =='POST':
print(request.FILES)
下面是print request.FILES的值
<MultiValueDict: {'upload_file': [<TemporaryUploadedFile: 02 python fullstack s10 day08 集合.avi (video/avi)>]}>
print(request.FILES['upload_file'].name ) #拿到文件的名字
02 python fullstack s10 day08 集合.avi
file_name = request.FILES['upload_file'].name #拿到文件的名字
with open(file_name,'wb')as f:
for chunk in request.FILES['upload_file'].chunks():
f.write(chunk)
return HttpResponse('上传OK') else:
return render(request, 'upload_file.html')


jason
url(r'^json_data/',views.json_test),
def json_test(request):
data ={'name':'小黑','age':}
import json
data_str =json.dumps(data) #把data序列化成json格式的字符串
return HttpResponse(data_str)

def json_test(request):
data ={'name':'小黑','age':}
data2 =[1,2,3,45,6,5]
# import json
# data_str =json.dumps(data) #把data序列化成json格式的字符串
# return HttpResponse(data_str)
from django.http import JsonResponse
return JsonResponse(data2) #这个代码会报错,因为只接受字典的 形式。
return JsonResponse(data,safe =False)

Django shortcut functions
url(r'^book/[0-9]{2,4}/$',views.book),


url(r'^book/([0-9]{2,4})/([a-zA-Z]{2})/$',views.book)
def book(request,arg1,arg2):#传三个参数
print('arg1:',arg1)
print('arg2:',arg2)
return HttpResponse('口哥说一个 ')

案例分析
# url(r'^publisher_del/',views.publisher_del),
url(r'^publisher_del/[0-9]+',views.publisher_del),
# def publisher_del(request):##只传一个参数
# del_id =request.GET.get('id')
# models.Publisher.objects.get(id=del_id).delete()
# print(111)
# return redirect('/publisher_list/')
# URL分组匹配
def publisher_del(request,del_id): #传两个参数
models.Publisher.objects.get(id=del_id).delete()
print()
return redirect('/publisher_list/')

Django中的路由
1.分组命名匹配
在Python的正则表达式中,分组命名正则表达式组的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式。
下面是以上URLconf 使用命名组的重写:
url(r'^book/([0-9]{2,4})/([a-zA-Z]{2})/$',views.book), #位置传参
url(r'^book/(?P<year>[0-9]{4})/(?P<name>[a-zA-Z]{2}/$)',views.book),#关键字传参
# 关键字参数
def book(request,year,title):
print('year:',year)
print('title:',title)
return HttpResponse("位置参数传参")


或者这样定义函数
def book(request,**kwargs):
print(kwargs)
return HttpResponse("位置参数传参")

=============================================
def book(request,year,title):
print('year:',year,type(year))
print('title:',title,type(title))
return HttpResponse("位置参数传参")

视图函数中指定默认值
# urls.py中
from django.conf.urls import url from . import views urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
] # views.py中,可以为num指定默认值
def page(request, num="1"):
pass


分组匹配---->相当于给视图函数传递位置参数
分组命名匹配---->相当于给视图函数传递关键字参数
(两个不要混合使用 )
命名URL 和URL反向解析
在app里新建一个urls 文件
app01下的url文件(新建的)
from django.conf.urls import url
from . import views # from app01 import views urlpatterns =[
url(r'^book/([0-9]{2,4})/([a-zA-Z]{2})/$',views.book1),
在主文件中的url文件中进行配置
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views,urls #这个url是
urlpatterns = [ url(r'^app01/',include(urls)), ]
视图函数里写
def book1(request,arg1,arg2):
print(arg1,arg2)
return HttpResponse("位置参数传参")







url反向解析 (给url起一个别名,反向解析出来)


防止路由改了之后, 后面的 view视图定义的函数和路径,html文件中的路径都要改!!









day 67 Django的view 与路由的更多相关文章
- 9.11 Django视图 view和路由
2018-9-11 16:34:16 2018-9-11 19:00:24 越努力,.越幸运! Django框架参考: https://www.cnblogs.com/liwenzhou/p/8296 ...
- Django的View(视图)和路由系统
一.Django的View(视图) 1.介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一 ...
- Django框架——基础之路由系统(urls.py)
1.URL路由系统前言 URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除 ...
- Django框架——基础之路由系统(urls.py)11111111
1.URL路由系统前言 URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除 ...
- Django的urls(路由)
目录 Django的urls(路由) 正则表达式详解 路由匹配(分组匹配) 无名分组 有名分组 反向解析 无名分组反向解析 有名分组反向解析 路由分发 名称空间 虚拟环境 伪静态 Django的url ...
- Django的View(视图层)
目录 Django的View(视图层) 一.JsonResponse 二.后端接收前端的文件 三. FBV和CBV(源码分析) 四.settings.py配置文件源码分析 五. 请求对象(HttpRe ...
- Django基础三之路由、视图、模板
Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...
- Django的View(视图)
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
- django第四天(路由别名,django2.x新特性和自定义转换器)
django第四天 路由别名 1.路由别名: 给路由路径命名一个名字 url(r'^login/$',views.login,name = 'login') 2.为什么要用路由别名 ①当路由路径过长时 ...
随机推荐
- hdu5943 Kingdom of Obsession 二分图+打表找规律
题目传送门 Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- 对VS2019进行32位汇编环境配置
1.库文件(很重要) 用我这一份就行:https://www.lanzous.com/i6364hg 2.VS依赖库 打开VS2019,选择桌面向导 配置项目时,选择新项目. 选择生成依赖项 选中ma ...
- 微软Visual Studio Code基本特征
Visual Studio Code它的核心功能还是作为一个代码编辑器.和其他的代码编辑器一样,VScode采取通用的UI和布局,浏览器在左边,显示所有的文件和文件夹,右边你打开的文件的编辑页面. 文 ...
- 卷积神经网络CNN原理以及TensorFlow实现
在知乎上看到一段介绍卷积神经网络的文章,感觉讲的特别直观明了,我整理了一下.首先介绍原理部分. [透析] 卷积神经网络CNN究竟是怎样一步一步工作的? 通过一个图像分类问题介绍卷积神经网络是如何工作的 ...
- shortcut to add throws declaration in Intellij Idea
When a piece of code needs error handling, IntelliJ underlines it with red. Set your pointer on that ...
- 抽象类(abstract)与接口(interface)的区别
如果一个类中包含抽象方法,那么这个类就是抽象类.abstract只能用来修饰类或者方法,不能用来修饰属性. 接口是指一个方法的集合,接口中的所有方法都没有方法体.接口通过关键字interface实现. ...
- Oracle 反键索引/反向索引
反键索引又叫反向索引,不是用来加速数据访问的,而是为了均衡IO,解决热块而设计的比如数据这样: 1000001 1000002 1000005 1000006 在普通索引中会出现在一个叶子上,如果部门 ...
- Codeforces Round #554 (Div. 2) C.Neko does Maths (gcd的运用)
题目链接:https://codeforces.com/contest/1152/problem/C 题目大意:给定两个正整数a,b,其中(1<=a,b<=1e9),求一个正整数k(0&l ...
- Vue实现active点击切换样式
1.html <div class="filter-nav" v-for="(item,index) in filterData.navTab" :key ...
- deepin开机进入intramfs无法正常开机
问题原因:由于非正常关机导致文件系统受损 解决方法: fsck /dev/sda6 注释:如果输入上面的指令只是出现如下提示 fsck from util-linux-ng 2.17.2(后面的数字可 ...