Django开发要点

发布时间 2023-10-15 16:47:15作者: CloudWk

一、内置标签及自定义

标签 描述
遍历输出上下文的内容
对上下文进行条件判断
生成csrf_token的标签,用于防护跨站请求伪造攻击
引用路由配置的地址,生成相应的路由地址
将上下文重新命名
加载导入Django的标签库
读取静态资源的文件内容
模板的继承,xxx为被继承的HTML模板的文件名,当前模板继承xxx
重写父类模板的代码,xxx为父类位置所在的变量名

注:if标签和for、block、with标签使用都需要结束标签,比如{% endif %}、{% endfor %}等等。

二、Django的分页功能

# Django当中进行分页功能的设计,可以使用自带的三个库完成分页功能
from dajngo.core.paginator import Paginator,EmptyPage,PageNotInteger

1、其中Paginator类分别定义了4个初始化参数和8个类方法,其中必填项有:

  • object_list:必选参数,代表需要进行分页处理的数据,参数值可以为列表、元组或ORM查询的数据对象等。
  • per_page:必选参数,设置每一页的数据量,参数值必须为整数。

2、其中EmptyPage功能为如果页码不在有效范围(即数据为空)引发该异常。

3、其中PageNotInteger功能为页码不是一个整数引发该异常。

Ps:Any类型在Python当中代表不限制给定的值,可以是列表、字典等等。其中Python自带的locals()函数代表将当前定义域下的所有变量保存为字典。

三、Session的配置及操作

​ 一般请求会在浏览器请求服务器完成之后,便会断开连接(会话结束),下次用户再来请求服务器,服务器就无法识别此用户是谁。比如用户的登录功能,如果刷新页面就会重新要求登录一次才能识别到用户。这样非常的影响用户体验,同时会对开发者带来大量的繁琐工作,同时对服务器的压力也非常大。

​ Cookie是从浏览器向服务器传递数据,让服务器能够识别当前用户,而服务器对Cookie的识别机制是通过Session来实现的,Session储存了用户的基本信息。由于Cookie是存储在浏览器当中,非常容易泄露用户信息,而且Cookie的大小不能超过4KB,不能支持中文,因此需要一种机制在服务器当中存储用户的数据,这个机制就是Session。

​ Cookie和Session都是为了让浏览器和服务端建立长久的联系的会话而出现的,两者的关系说明如下:

  • Session存储在服务器端,Cookie存储在客户端,所以Session的安全性比Cookie高。
  • 当获取某用户的Session数据时,首先从用户传递的Cookie里获取sessionid,然后根据sessionid在服务器当中找到对应的Session。
  • Session存放在服务器的内存中,Session数据的不断增加会造成服务器的负担,因此存放在Session当中的数据不能过于庞大。

四、CSRF防护

​ CSRF(跨站请求伪造)也被称为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,这是一种对网站的恶意运用,其目的是为了是为了窃取网站用户的用户信息来制造恶意请求。

​ Django为了防护这一类攻击,在用户提交表单的时候,表单会自动加入csrfmiddlewaretoken隐藏控件,这个隐藏控件的值会与网站后台的csrfmiddlewaretoken进行匹配,只有匹配成功,网站才会处理表单数据。这种防护机制称为CSRF防护。

​ 如果表单当中设置了CSRF防护功能,我们可以查看表单的值,隐藏控件是由模板语法{% csrf_token %}生成的。用户每次提交表单或者刷新网页时,隐藏控件的属性value都会随之变化。

​ 如果想要取消表单的CSRF防护,那么可以在模板文件删除{% csrf_token %},并且在对应视图函数中添加装饰器@csrf_exempt。如果只在模板文件中删除CSRF,并没有在对应的视图函数当中设置过滤器@csrf_exempt,那么用户提交表单时,程序会因为CSRF验证失败而抛出403异常页面。

五、请求的方式

​ 一般情况下使用最常见的方式就是POST和GET方法,POST和GET都能携带参数,参数为:www.xxx.com?(?符号代表将域名和传递的参数值进行隔开)key=value的形式进行传递,参数与参数之间使用“&”进行隔开。实际开发当中POST请求一般用于更改数据库之中的数据,换言之任何更改数据库的的请求都应该用到POST请求而不是GET。GET只用于不会影响系统数据(不会更改数据库数据)的请求。

​ 原因就是:GET请求的参数值在URL当中,而POST请求的值并不在URL当中。所以从安全角度POST请求更加好,但是在开发当中也要注意应对不同的要求合理使用请求的方式。

六、Django的表单类

​ 如果我们搭建的网站只发布内容不接受用户的输入,那么就不需要表单。换言之如果你需要用户输入数据进行交互,那么就需要用到表单进行实现。

1、html表单

​ 在前端html代码之中,

.....
括起来的内容就是表单,它允许我们输入文本、数据选择、操作对象,然后将这些数据通过POST请求转发给服务器,也就是说我们编写Django操作表单需要制定两点:数据的URL地址、数据请求时使用的方法。

<form action="表单提交地址" method="提交方法">
    … 文本框、按钮等表单元素…
</form>

2、Django在表单当中的角色

​ 处理表单是一个非常复杂的业务流程,在Django当中可以简化以上内容,提高开发效率:

  • 1.准备重组数据,以便下一步的渲染。
  • 2.为数据创建HTML表单。
  • 3.接受并处理客户端提交的表单及数据。

3、构建一张表单

3.1表单类

根目录下生成forms.py,django中表单内容:

from django import forms

class NameForm(forms.Form):
    your_name = forms.CharField(label='your name', max_length=100)

每个form实例都有is_valid()方法,如果用户输入了内容,则返回True且将表单数据存储在属性cleaned_data中。

3.2视图

Django网站的表单数据会交给后台的视图(views.py)来处理,为了处理表单数据,我们需要将它实例化到我们需要的URL之中。

from django.http import HttpResponseRedirect
from django.shortcuts import render
froms .form import NameForm

def get_name(request):
    if request.method == 'POST'
    # 如果这个表单请求是POST,我们需要处理数据
    	form = NameForm(request.POST)
        if form.is_valid() # 检查界面是否输入了表单数据。
        	# 表单数据存储在form.cleaned_data之中
            return HttpResponseRedirect('/thanks/') #需要返回的界面,输入该界面的URL地址
    else:
    	# 如果不是POST请求,将创建一个空表单。
        form = NameForm()
    return render(request, 'name.html', {'form':form})
3.3模板

其中{{ form }}中的form是get_name()里的变量form = NameForm(),把定义的这个表单类传入到界面:

<form action='/you-name/', method='post'> <!-- action是请求的地址,method是请求的方式 -->
    {{ csrf_token }}
    {{ form}}
    <input type='submit' value='Submit'>
</form>

4、详解Django表单的类

只需要将表单实例放在表单模板当中即可,例如上面的NameForm()的实例form,传入表单模板name.html之中。

else:
    # 如果不是POST请求将创建一个空的表单
    form = NameForm()
    return render(reuqest, 'name.html', {'form':form})# 这一行form字段的功能是将实例form传递给模板name.html,方便模板文件调用{{ form }}
4.1表单的渲染选项

表单界面是以什么样的形式展现,分为三种表格、段落、列表呈现。

  • {{ form.as_table }} 将它们呈现为包含在标签中的表格单元格
  • {{ form.as_p }} 将他们包裹在

    标签当中

  • {{ form.as_ul }} 将他们包裹在
  • 标签当中
<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form.as_table }}
    <input type="submit" value="Submit">
</form>

<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
</form>

<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form.as_ul }}
    <input type="submit" value="Submit">
</form>
4.2 遍历表单字段

如果要给每个字段使用相同的html控件,则使用{% for %}依次循环处理

{% for field in form %}
	<div class='fieldWrapper'>
        {{ field.errors }}
        {{ field.label_tag }}{{ field }}
        {% if field.help_text %}
        <p class='help'>{{ field.help_text|safe }}</p>
        {% endif %}
	</div>
{% endfor %}