一、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. Netty核心组件介绍及手写简易版Tomcat

    Netty是什么: 异步事件驱动框架,用于快速开发高i性能服务端和客户端 封装了JDK底层BIO和NIO模型,提供高度可用的API 自带编码解码器解决拆包粘包问题,用户只用关心业务逻辑 精心设计的Re ...

  2. Codeforces Round #535 E2-Array and Segments (Hard version)

    Codeforces Round #535 E2-Array and Segments (Hard version) 题意: 给你一个数列和一些区间,让你选择一些区间(选择的区间中的数都减一), 求最 ...

  3. SqlServer 查看表注释

    SELECT DISTINCT d.name, f.value FROM syscolumns a LEFT JOIN systypes b ON a.xusertype= b.xusertype I ...

  4. 攻防世界--maze

    测试文件下载:https://adworld.xctf.org.cn/media/task/attachments/fa4c78d25eea4081864918803996e615 1.准备 获得信息 ...

  5. sessionStorage 使用方法

    作为html5中Web Storage的一种存储方式,localStorage和sessionStorage一样都是用来存储客户端临时信息的对象. W3c上给的介绍是这两者区别在于前者用于持久化的本地 ...

  6. 源码分析--HashMap(JDK1.8)

    在JDK1.8中对HashMap的底层实现做了修改.本篇对HashMap源码从核心成员变量到常用方法进行分析. HashMap数据结构如下: 先看成员变量: 1.底层存放数据的是Node<K,V ...

  7. 【linux 进程杀死】批量杀死进程

    一次杀死包含 api_antispan 开头的的所有进程 https://blog.csdn.net/u013421629/article/details/83512498

  8. bzoj 1001 原图最小割转化为对偶图最短路

    题目大意: 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形 ...

  9. spring boot 热部署devtools实现(成功,主要是添加依赖后配置setting)

    1.devtools spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot ...

  10. 每天一个linux命令:tail(16)

    tail tail命令用于输入文件中的尾部内容,不指定文件时,作为输入信息进行处理.tail命令默认在屏幕上显示指定文件的末尾10行.命令从指定点开始将文件写到标准输出,使用tail命令的-f选项可以 ...