Django之视图篇(Python)

#前言:

该文是Django十日计划中的视图篇,前几篇主要介绍了,Django的创建,Django各个文件的作用,以及Django的路由,感兴趣的可以去看我之前发的博客,欢迎任何指正和建议。如果您在我的博客中发现任何错误、不准确或者需要补充的地方,请不要犹豫,提出来让我知道。我认识到自己在语言表达、逻辑思维和知识储备方面都有待提高和学习,所以非常感谢您的反馈,这将帮助我改进并提升我的文章质量。

一、视图的介绍:

django 项目中视图就相当于 Python 函数或者类;Django 接收到浏览器的发送的请求之后, 进行 URL 匹配,找到对应的视图进行响应。

视图中第一个参数必须是 HttpRequest 的对象(正常情况下,我们默认写为 request)。

视图中必须返回一个 HttpResponse 对象或者其子类对象作为响应。

def index(request):
    response = HttpResponse('index')
    return response

def get_html(request):
    # 模板化:将 html 文件转换为带有前端标签的字符串
    # render 方法内部 , 将转换好之后的字符串使用 HttpResponse 对象进行返回,作为响应数据
    return render(request , 'index.html')

def coll(request):
    # redirect url 重定向 状态码:302
    # redirect 方法内部返回的是 HttpResponse 的子类 : HttpResponseRedirect 对象
    return redirect('www.baidu.com')

二、具体操作:

1、请求: HttpRequest:

HttpRequest 是 django 在视图中处理 HTTP 请求操作。

当浏览器发送请求到 django 中,django 接收到请求并且进行查询匹配对应的 URL,找到 URL 和 视图的映射关系之后。创建 HttpRequest 对象,将用户的请求数据封装到这个对象中,当触发到视图之后,这个对象会被作为第一个参数传入视图中。

下面我会以一个例子讲解:

def index(request):

    # 获取请求方法:GET
    print(request.method)

    # 获取请求中的参数:GET
    # 正常情况下, GET 和 POST 请求的参数会以键值对的方式封装在 request 中
    #  GET 请求的数据 ,用 ? 连接到 URL 后面 , 多个参数使用 & 连接
    # /index/?name=ac&age=27
    name = request.GET.get('name')
    age = request.GET.get('age')
    print(name , age)
    print('='*20)

    # 获取 URL 中的请求路径
    # /index/ , 只获取当前视图请求的 URL , 不携带参数
    url_path = request.path 
    # /index/?name=ac&age=27 , 获取当前视图请求的 URL 并且携带了参数
    get_full_path = request.get_full_path()
    print(url_path)
    print('*'*20)
    print(get_full_path)

    response = HttpResponse('index')
    return response

做一个简易登录界面的实例:

在templates文件底下创建一个html文件(这里我们以login.html为例子)

在html文件中,创建一个表单。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post">
    {% csrf_token %}
    <input type="text" name="username" placeholder="用户名">
    <input type="password" name="password" placeholder="密码">
    <input type="submit" value="登录">
</form>

</body>
</html>

注意:我们用的是post请求,其中底下必须有个命令{% csrf_token %},不然无法进行post请求。

而在视图文件中:我们在此先不导入数据库,数据库操作会在后续讲解,在这我们以用户名(ac),密码(123)为例子。

def login_view(request):
    if request.method=='GET':
        return render(request,'login.html')
    #上面这个操作就是说在这个页面发生了GET请求 就把数据返回到request里面,然后进行下面的操作

    name=request.POST.get('username')
    pwd=request.POST.get('password')
    print(name,pwd)
    if name=='ac'and pwd=='123':
        return HttpResponse('登陆成功')
    else:
        return HttpResponse('登录失败')

当获取到html内容后:

就可以输入内容进行判断了。

2、响应:HttpResponse:

django 提供了 HttpResponse 子类作为响应状态 , 这些子类封装中 django.http 模块中

这里直接以代码为例子讲解:

from django.http import HttpResponseRedirect , HttpResponseForbidden

def status_302(request):
    # HttpResponseRedirect 等同于 redirect
    return HttpResponseRedirect('/login/')

def status_403(request):
    return HttpResponseForbidden('请求被拒绝')

def status_404(request):
    # 直接指定 HttpResponse 对象的响应状态码
    return HttpResponse('404' , status=404)

HttpResponse 处理响应的内容:

def response_view(request):
    # context_type   设置响应的文本格式 , 字符编码
    # text/html; charset=utf-8 表示内容以 html 文本格式响应
    # text/plain; charset=utf-8 表示内容以纯文本格式响应
    return HttpResponse('<h1>你好 , 今晚一起去吃KFC</h1>' , content_type="text/plain; charset=utf-8")

3、类视图:

类视图,是把函数视图中封装的请求方法进行拆分,将不同的请求方法封装为一个独立的方法中。在类试图中,它有个很好的优点,就是不需要像上面的内容一样对post请求和get请求进行判断。

注意在使用类视图前先必须要导包:

from django.views import View

而这个View十分重要,在底下类的方法中参数都必须为View。

class MyView(View):#参数必须是View
    #注意方法只能由post,get命名
    #下面代码的意思就是发生get请求就调用get,post则调用post
    def get(self,request):
        return render(request,'index.html')
    def post(self,request):
        return HttpResponse("这是post请求")
class LoginView(View):
    def get(self,request):
        return render(request,'login.html')
    def post(self,request):
        name = request.POST.get('username')
        pwd = request.POST.get('password')
        print(name, pwd)
        if name == 'ac' and pwd == '123':
            return HttpResponse('登陆成功')
        else:
            return HttpResponse('登录失败')

注意:在对html页面进行发起请求时候一般都是GET请求,要发生post请求可以在html文件中特意说明。

而此时在路由文件中:

urlpatterns = [

    path('my/',views.MyView.as_view()),#只有加了as_view()后才会生效.
    path('login_view/',views.LoginView.as_view()),
]

它必须添加view()才能生效,不然会发生报错。

4、自定义 404 页面:

在当访问一些我们没有定义的路由时经常会弹出:

为了美化我们的项目,我们可以自定义404页面。

创建一个叫404的html文件后,在视图文件中:

def custom_404(request,exception):
    return render(request,'404.html',status=404)#记得响应状态码也要改

而此时在路由文件中切记不是用path方法,而是在urlpatterns前面添加:

from django.conf.urls import handler404
handler404=views.custom_404

此时若是直接运行会发生报错,原因就是在setting.py文件中:做以下操作便可以

DEBUG = False

ALLOWED_HOSTS = ['*']

然后再次运行,此时若是输入没有自定义的路由后会出现自己编辑的404.html文件的内容。

三、总结:

该文主要写了关于Django中关于视图的一些基本操作,包括:视图的请求、响应HttpResponse、类试图、自定义404界面等。如若发现错误欢迎各位大佬来指正。后续我会继续更新关于Django的其它操作,大家可以点个关注坐等后续。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值