天天看点

Django 4.Django框架 - 视图详解

Django框架 - 视图详解

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

视图(即视图函数):就是一个python函数,专门处理web程序中的业务逻辑部分

视图可以接收用户的请求,并返回响应给用户的内容,可响应的的内容包括字符串、html页面、图片等各种格式

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

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

请求对象 request

HTTP请求是指从客户端到服务器端的请求消息,包括消息首行中,对资源的请求方法、资源的标识符及使用的协议

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

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

  • request.path 包含了请求的url路径
  • request.method 包含请求的HTTP方法 GET,POST
  • request.META.get('REMOTE_ADDR') 获取客户端IP
  • request.GET 类字典对象,包含GET请求的数据
  • request.POST 类字典对象,包含POST请求的数据
  • request.FILES 类字典对象,包含上传的文件对象
  • request.COOKIES 类字典对象,cookied对象

1.GET和POST请求

GET和POST都是HTTP常用的请求方式,除了这两个常用的方式以外还有很多其他请求方式

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

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

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

POST请求一般都是由表单发起的,POST请求时所携带的数据是不可见的

区别:

  • GET把参数包含在URL中,POST通过报文体传递参数
  • GET请求在URL中传送的参数是有长度限制的,而POST没有
  • GET发送的数据是 URL 的一部分,安全性较差,POST参数不会被保存在浏览器历史或web服务器日志中,更安全

2.获取GET和POST请求的数据

获取GET请求方式携带的参数:
  • request.GET.dict() 获取GET中所有键值对,形成dict
  • request.GET.get( 'key' , None) 获取指定key的值,可以设置默认值
  • request.GET[ 'key' ] 把GET对象当做dict使用,如果key不存在则引发异常
获取POST请求方式携带的参数:
  • request.POST.dict() 获取POST中所有键值对,形成dict
  • request.POST.get( 'key' , None) 获取指定key的值,可以设置默认值
  • request.POST[ 'key' ] 把POST对象当做dict使用,如果key不存在则引发异常
1.准备HTML模板页面 templates/GET和POST请求.html
<body>
    <ul>
        <li>
            <!-- ?id=1&k=w 是http请求时携带的参数 -->
            <a href="/http/demo/?id=1&k=w">GET请求方式</a>
        </li>
        <li>
            <!-- form是表单;action属性是提交地址;method属性是提交方式,默认为GET -->
            <form action="/http/demo/" method="POST">
                <!-- Django框架中对CSRF攻击做了安全防范,需要在所有POST请求中添加csrf_token口令进行验证 -->
                {% csrf_token %}
                <input type="text" name="kw">
                <button>POST请求方式</button>
            </form>
        </li>
    </ul>
</body>
      
2.准备接收请求的视图函数 web/home/views.py
# 显示html模板页面的视图函数
def index(request):
    return render(request,'GET和POST请求.html')

# 接收HTTP请求的视图函数
def HttpDemo(request):
    # 获取当前的请求方式
    method = request.method

    if method == 'GET' :
        # 接收GET发送的数据
        data = request.GET.dict()
    elif method == 'POST' :
        # 接收POST发送的数据
        data = request.POST.dict()

    return HttpResponse(f'GET和POST请求,当前请求方式:{method},接收的数据:{data}')
      
3.准备路由 web/home/urls.py
path('', views.index),
path('http/demo/', views.HttpDemo, name='HttpDemo')
      

响应对象 HttpResponse

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

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

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

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

# web/home/views.py
def index(request):
    return HttpResponse('<p style="color:red;">响应任意字符串内容</p>')
      

2.返回模板文件

# render()有三个参数,第一个是请求对象,第二个是响应模板文件,第三个是传递给模板的dict数据
def index(request):
    fcb = {'name':'哈白布','age':30,'pos':'mid'}
    return render(request,'GET和POST请求.html', {'FCB':fcb})

# 对应的 GET和POST请求.html 中就可以使用模板引擎的语法来解析传递的数据
# <p>{{ FCB }}</p>
      

3.返回json数据 JsonResponse

def index(request):
    fcb = {'name':'哈白布','age':30,'pos':'mid'}

    # 可以在视图中直接返回json数据
    return JsonResponse(fcb)    # Content-Type: application/json

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

4.重定向 redirect

服务器端的跳转
def index(request):
  return redirect('/http/demo/')
  # return HttpResponseRedirect('/http/demo/')