Django框架视图详解

Django使用视图这个概念来负责 处理用户请求和返回响应的逻辑部分。

视图函数或者视图简单理解,就是python的一个函数,专门处理web程序中的业务逻辑部分

视图可以接受用户的请求,并且返回响应给用户的内容,可以响应很多格式内容:例如字符串,html页面,图片等各种形式。

通常情况下,把所有的视图代码都放置在views.py文件内,也可以自定义存放。

在视图函数中最重要的是 关于用户请求和响应。

请求对象 request

request 是Django框架根据用户的请求报文封装的一个对象

request 对象对象中包含了所有请求相关的内容

  • request.path 包含了请求的url路径

  • request.method 包含了请求的HTTP方法 POST,GET

  • request.META.get(‘REMOTE_ADDR’) 获取客户端IP

  • request.GET 类字典对象。包含了GET请求的数据 (后面单独讲)

  • request.POST 类字典对象。 包含了POST请求的数据(后面单独讲)

  • request.FILES 类字典对象。 包了上传的文件对象(后面单独讲)

  • request.COOKIES 类字典对象。 cookie对象(后面单独讲)

GET与POST请求

GET和POST都是HTTP请求的常用方式,除了这两个常用的方法之外还有很多,例如:PUTE,DELETE。。。

GET请求就是在浏览器地址栏位置发起请求或者是a链接发起的请求,通常情况下,请求中所携带的参数会在地址栏位置显示,例如:

HTTP:GET : http://127.0.0.1:8080/a/b/c?id=1&k=w

上面这个url如果使用的是GET请求,那么在地址栏就会显现请求的参数 id=1&k=w

POST请求一般都是由表单发起的,POST请求时所携带的数据在浏览器地址栏是不可见的。

举例说明GET和POST的区别:

GET和POST如果是快递员,那么GET就是骑电动自行车的快递员,所携带的包裹就是参数,去往的目的地就是请求的地址。这样的话,这个GET快递员所携带的包裹是可见的,相对不安全,并且所携带的包裹数量有限。

POST就是升级版的快递员,骑着电动三轮车的快递员,所以的包裹都放在三轮车的车厢里,包裹是不可见,相对安全,并且所携带的包裹的数量也比电动自行车多。

  • GET是HTTP的常见请求方式,参数地址栏可见,相对不安全,并且参数数量有限制。
  • POST是HTTP的常见请求方式,参数地址栏不可见,相对安全,参数的数据长度受服务器限制。

获取GET获取POST请求的数据

获取GET请求方式携带的数据:
  • requets.GET.dict() 可以把所有GET中的键值对获取,形成字典
  • requets.GET.get(‘key’,None). 获取指定key的值,可以设置默认值
  • Request.GET[‘key’]. 把GET对象当作字典使用,注意如果key不存在会报错

获取POST请求方式携带的数据:
  • requets.POST.dict() 可以把所有POST中的键值对获取,形成字典
  • requets.POST.get(‘key’,None). 获取指定key的值,可以设置默认值
  • Request.POST[‘key’]. 把POST对象当作字典使用,注意如果key不存在会报错

1.准备HTML模版页面 templates/index.html

  1. <ul>
  2. <li>
  3. <a href="/http/demo/?id=1&k=abc">GET请求的演示Demo</a>
  4. </li>
  5. <li>
  6. <!-- form 是表单,action属性是提交地址。method是提交方式,默认为GET -->
  7. <form action="/http/demo/" method="POST">
  8. <!-- 在Django框架中 对CSRF攻击做了安全防范
  9. 因此,需要在所以的POST请求中 添加 csrftokn口令进行验证,
  10. -->
  11. {% csrf_token %}
  12. <input type="text" name='kw' >
  13. <button>POST请求的演示Demo</button>
  14. </form>
  15. </li>
  16. </ul>

2.准备接受请求的视图函数 web/home/views.py

# 显示 html模版页面的视图函数
def index(request):

    return render(request,'index.html')

# 接收HTTP请求的 视图函数
def HttpDemo(request):
    # 获取当前的请求方式
    method = request.method
    if method == 'GET':
        # 接受GET数据
        data = request.GET.dict()
    elif method == 'POST':
        # 接受POST数据
        data = request.POST.dict()

    print(data)

    return HttpResponse(f'当前请求方式:{method},接收的数据是:{data}')

3.准备路由 web/home/urls.py

from django.urls import path,re_path
from . import views

urlpatterns = [
    path('', views.index),
    path('req/info/', views.req_info),
    path('http/demo/',views.HttpDemo,name="HttpDemo")
]

响应对象 HttpResponse

1.在Django.http模块中定义了HttpResponse响应对象的API

2.HttpResponse响应对象是由Django框架自动创建,并且由开发者设置具体的响应内容

3.在每一个经过路由解析的视图中必须返回一个HttpResponse响应对象,或者HttpResponse的子对象

1. 直接使用HttpResponse对象返回内容

# web/home/views.py
def index(request):

    return HttpResponse('<p style="color:red;">可以响应任意字符串内容</p>')

2.返回模版文件

# web/home/views.py
def index(request):
    # render有三个参数,第一个参数是请求对象,第二个参数是响应模版文件,第三个参数是字典,传递给模版的数据
    love = 'iloveyoutosimida'
    return render(request,'index.html',{'lovestr':love})
# 对应的 index.html中就可以使用 模版引擎的语法来解析传递的数据
# <p>{{ lovestr }}</p>

3.直接返回Json数据

def index(request):

    # 可以在视图函数中直接返回 json数据,JsonResponse
    data = {'name':'张三','age':20,'sex':'m'}

    return JsonResponse(data)  # Content-Type: application/json

    # 也可以手动把数据转为json,在使用 HttpResponse进行响应
    # return HttpResponse(json.dumps(data))  # Content-Type: text/html; charset=utf-8

        # 但是有区别:Content-Type: application/json   # Content-Type: text/html; charset=utf-8

4.重定向

重定向 ,服务器端的挑战

可以使用 HttpResponseRedirect,或者简写 redirect

def index(request):

    # 重定向
    # return HttpResponseRedirect('/http/demo/')
    return redirect('/http/demo')