一、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 与路由的更多相关文章

  1. 9.11 Django视图 view和路由

    2018-9-11 16:34:16 2018-9-11 19:00:24 越努力,.越幸运! Django框架参考: https://www.cnblogs.com/liwenzhou/p/8296 ...

  2. Django的View(视图)和路由系统

    一.Django的View(视图) 1.介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一 ...

  3. Django框架——基础之路由系统(urls.py)

    1.URL路由系统前言 URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除 ...

  4. Django框架——基础之路由系统(urls.py)11111111

    1.URL路由系统前言 URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除 ...

  5. Django的urls(路由)

    目录 Django的urls(路由) 正则表达式详解 路由匹配(分组匹配) 无名分组 有名分组 反向解析 无名分组反向解析 有名分组反向解析 路由分发 名称空间 虚拟环境 伪静态 Django的url ...

  6. Django的View(视图层)

    目录 Django的View(视图层) 一.JsonResponse 二.后端接收前端的文件 三. FBV和CBV(源码分析) 四.settings.py配置文件源码分析 五. 请求对象(HttpRe ...

  7. Django基础三之路由、视图、模板

    Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...

  8. Django的View(视图)

    Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

  9. django第四天(路由别名,django2.x新特性和自定义转换器)

    django第四天 路由别名 1.路由别名: 给路由路径命名一个名字 url(r'^login/$',views.login,name = 'login') 2.为什么要用路由别名 ①当路由路径过长时 ...

随机推荐

  1. hdu5943 Kingdom of Obsession 二分图+打表找规律

    题目传送门 Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  2. 对VS2019进行32位汇编环境配置

    1.库文件(很重要) 用我这一份就行:https://www.lanzous.com/i6364hg 2.VS依赖库 打开VS2019,选择桌面向导 配置项目时,选择新项目. 选择生成依赖项 选中ma ...

  3. 微软Visual Studio Code基本特征

    Visual Studio Code它的核心功能还是作为一个代码编辑器.和其他的代码编辑器一样,VScode采取通用的UI和布局,浏览器在左边,显示所有的文件和文件夹,右边你打开的文件的编辑页面. 文 ...

  4. 卷积神经网络CNN原理以及TensorFlow实现

    在知乎上看到一段介绍卷积神经网络的文章,感觉讲的特别直观明了,我整理了一下.首先介绍原理部分. [透析] 卷积神经网络CNN究竟是怎样一步一步工作的? 通过一个图像分类问题介绍卷积神经网络是如何工作的 ...

  5. 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 ...

  6. 抽象类(abstract)与接口(interface)的区别

    如果一个类中包含抽象方法,那么这个类就是抽象类.abstract只能用来修饰类或者方法,不能用来修饰属性. 接口是指一个方法的集合,接口中的所有方法都没有方法体.接口通过关键字interface实现. ...

  7. Oracle 反键索引/反向索引

    反键索引又叫反向索引,不是用来加速数据访问的,而是为了均衡IO,解决热块而设计的比如数据这样: 1000001 1000002 1000005 1000006 在普通索引中会出现在一个叶子上,如果部门 ...

  8. 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 ...

  9. Vue实现active点击切换样式

    1.html <div class="filter-nav" v-for="(item,index) in filterData.navTab" :key ...

  10. deepin开机进入intramfs无法正常开机

    问题原因:由于非正常关机导致文件系统受损 解决方法: fsck /dev/sda6 注释:如果输入上面的指令只是出现如下提示 fsck from util-linux-ng 2.17.2(后面的数字可 ...