1

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':19}
    import json
    data_str =json.dumps(data) #把data序列化成json格式的字符串
    return HttpResponse(data_str)

 

 

 

def json_test(request):
    data ={'name':'小黑','age':19}
   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(111) 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文件中的路径都要改!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-05-09 10:06  萌哥-爱学习  阅读(192)  评论(0编辑  收藏  举报