django 学习笔记-视图响应

视图响应

视图响应数据

django和大多数的web框架一样,针对http请求的响应,提供了2种不同的响应方式:

1 . 响应内容

就是直接返回数据给客户端

 ( 1 ) 响应html内容【一般用于web前后端不分离的项目】

 ( 2 ) 响应json内容【一般用于开发web前后端分离的项目的api接口开发】

home/views.py 视图函数代码

def json(request):HttpResponse的内容
    
    '''在postman里面的下半部分body里面获取响应内容,就是测试结果'''
    
   1 . 响应内容:HttpResponse的内容,在客户端显示内容
    return HttpResponse("hello")
	
   
	# 通过django.http.response.HttpResponse 默认响应html内容   
    HttpResponse参数说明:
    # 参数1:content, 响应正文的内容
    # 参数2:status, 响应状态码
    # 参数3:content-type,响应内容的MIME类型
	rep = HttpResponse(content="hello",
                   status=206,
                   content_type="text/html")
	return rep

2 . 返回响应内容的数据格式

	# (1) 返回HTML数据 text/html
	rep = HttpResponse(content="<h1>响应</h1>",
                   status=206,
                   content_type="text/html")
	return rep

    

    ## (2) 返回json格式数据application/json
     content = {
         "name":"xiaoming",
         "age": 32,
         "son":{
             "name":"xiaoxiaoming",
             "age": 5,
         }
     }
    #  将以上字典转json字符串返回去
     import json
     content = json.dumps(content)
     return HttpResponse(content=content, 
                         status=206,
                         content_type="application/json"
                        )
    
    '''JsonResponse 就相当于把数据json化之后的内容返回,一步完成'''
    from django.http.response import JsonResponse
     content = {
         "name":"xiaoming",
         "age": 32,
         "son":{
             "name":"xiaoxiaoming",
             "age": 5,
         }
     }
 如果返回字典数据,直接用JsonResponse(),不用再转换成json格式,直接返回json数据.
    content = [
        {"id":10,"title":"javascript从入门到放弃", "price":10},
        {"id":11,"title":"java从入门到放弃", "price":10},
    ]
    
#####** django中要返回列表格式的json数据,需要在响应参数中设置safe=False
    return JsonResponse(content,safe=False)

"""通过响应对象不仅可以返回HTML网页信息,还可以返回纯文本,或者图片,甚至完成文件下载的功能[这个过程只需要设置content_type即可]"""

	# (3) 返回 图片信息 image/png
    # 常用于开发中,防盗链,资源防盗,资源下载
    content = open("release.png","rb").read()
     return HttpResponse(content=content, status=206, content_type="image/png")
   # (4)提供下载支持
    def index5(request):
    """响应对象"""
    """还可以是其他格式数据,用于提供下载"""
    # with open("./basic-2.2.1.zip","rb") as f:
    #     content = f.read()
    # return HttpResponse(content,content_type="application/x-zip-compressed")
      

自定义响应头

def index5(request):
    """响应对象"""
    """还可以是其他格式数据,用于提供下载"""
    # with open("./basic-2.2.1.zip","rb") as f:
    #     content = f.read()
    # return HttpResponse(content,content_type="application/x-zip-compressed")
2 . 响应页面:

就是通过返回页面跳转的信息给浏览器(客户端),让浏览器自己进行页面跳转,获取数据

#(1) 跳转到站外
def index5(request):
    """响应对象"""
	from django.shortcuts import redirect
    # 方式1
    # return HttpResponseRedirect("http://www.baidu.com")

    # 方式2
    # return redirect("http://www.baidu.com")
   
#(2) 跳转到站内
def center(request):
    # 方式1
    # return redirect("/student/login")

    # 方式2
    print( reverse("stu:user_login") ) # 路由反转,自动根据编写的视图方式名反解析成url地址.但在子应用urls文件中要加上app_name = "student"(  当前子应用的包名)
    return redirect( reverse("stu:user_login") )

def login(request):
    return HttpResponse("登录页面")

在站内跳转时,如果使用reverse进行路由反转解析,则必须在总路由和子路由文件中,对路由的前缀和子路由进行别名绑定.方法如下:

##(1) 总路由文件demo/urls.py
from django.contrib import admin
from django.urls import path
from django.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('home/', include('home.urls',namespace="应用别名") ),
    path('student/', include('demo.student.urls',namespace="stu") ),
]

## (2)子路由文件,例如:student/urls.py
from django.urls import path
from . import views
app_name = "student" # 当前子应用的包名
urlpatterns = [
    # path("index", views.index ),
    # path("index2", views.index2 ),
    # path("index3", views.index3 ),
    path("center", views.center ),
    path("login", views.login, name="user_login" ),
]


posted @ 2021-05-31 22:37  豆#豆  阅读(86)  评论(0)    收藏  举报