一、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. 史上最全最常用的正则表达式(转自微信公众号:javascript)

    很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下,在这里分享一下.给自己留个底,也给朋友们做个参考. ...

  2. bzoj1779 [Usaco2010 Hol]Cowwar 奶牛战争(网络流)

    1779: [Usaco2010 Hol]Cowwar 奶牛战争 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 302  Solved: 131[Sub ...

  3. 【JMeter5.0】Mac安装JDK和JMeter5

    之前讲了Windows下安装JDK和JMeter4.0的方法,其实不论操作系统是Windows.Mac OS.Linux等,JMeter所需要的基础环境配置都是类似的,本文介绍JMeter for M ...

  4. jquery实现表单验证与页面加载之后执行渲染

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 从“中产梦”中醒来,好好打工吧

    "中产"定义 自打"中产阶级/阶层"概念出现,总有人试图给出定义.搞不清何为"中产"却试图定义"中产阶级/阶层",注定是 ...

  6. python常用函数 B

    B bin(int) 将整数x转换为二进制字符串,如果x不为Python中int类型,x必须包含方法__index__()并且返回值为integer. 例子:

  7. linux中设置虚拟域名

    一.打开tomcat安装目录下conf/server.xml这个文件在server.xml文档中找到 </Engine></Service> 接着添加上面添加以下内容(暂时先说 ...

  8. 牛客网NOIP赛前集训营-提高组(第七场)B-随机生成树

    题目描述 牛牛在纸上画了\(N\)个点(从\(1\)到\(N\)编号),每个点的颜色用一个整数描述. 牛牛决定用这\(N\)个点随机生成一棵树,生成的规则如下: \(1\)号点是根节点 对于\(2\) ...

  9. SERVLET API中转发与重定向的区别?

    SERVLET API中转发与重定向的区别? 1.转发(forward方法) 转发仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址. 转发是服务器请求资源,服务器直接访问目标地址的 ...

  10. 英语单词substitution

    substitution 来源——shell字符串切片 [root@centos73 ~]# echo ${$alpha:3:4} -bash: ${$alpha:3:4}: bad substitu ...