博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django补充
阅读量:5127 次
发布时间:2019-06-13

本文共 6829 字,大约阅读时间需要 22 分钟。

django页面渲染具体流程

  在django的页面渲染中,下面这段程序

def test1(request):    return render(request,'aa.html',{
'data':'wusir'})

  等同于

from django.template import loaderdef test1(request):    html = loader.get_template('aa.html')    html_str = html.render({
'data':'wusir'}) return HttpResponse(html_str)

django中自定义simple_tag

  1、在app目录下创建一个文件夹名字叫templatetags,名字不能改,在该文件夹下随便建一个xxx.py文件,写入以下代码

from django import templateregister = template.Library()@register.simple_tagdef func(a1,a2): #(参数任意多).......

  2、在前端页面的顶部写上{% load xxx %},然后就可以使用后端所定义的函数{% func 1 2 %}

PS:simple_tag不能作为if后面的判断条件,但是参数任意多

django中自定义filter

  1、在app目录下创建一个文件夹名字叫templatetags,名字不能改,在该文件夹下随便建一个xxx.py文件,写入以下代码

from django import templateregister = template.Library()@register.filterdef func(a1,a2): #(参数最多两个).......

  2、在前端页面的顶部写上{% load xxx %},然后就可以使用{ { xxx|func:yyy } } ,xxx,yyy对应两个参数 ,如果函数只有一个

参数,func后面的冒号和后面的参数就不用写了。
PS:能作为if后面的判断条件,但是参数最多两个,并且冒号后面不能加空格

基于FBV、CBV的用户认证装饰器

  FBV

def login(request):    if request.method == 'GET':        return render(request,'login.html')    if request.method == 'POST':        username = request.POST.get('username')        password = request.POST.get('password')        obj = User.objects.filter(username=username).first()        if not obj:            return redirect('/app/login/')        if password == obj.pwd:            res = redirect('/app/index/')            res.set_cookie('username',username)            return res        else:            return redirect('/app/login/')def auth(func):    def inner(request,*args,**kwargs):        res = request.COOKIES.get('username')        if not res:            return redirect('/app/login/')        return func(request,*args,**kwargs)    return inner@authdef index(request):    res = request.COOKIES.get('username')    return render(request,'index.html',{
'data':res})
views.py

  CBV

def login(request):    if request.method == 'GET':        return render(request,'login.html')    if request.method == 'POST':        username = request.POST.get('username')        password = request.POST.get('password')        obj = User.objects.filter(username=username).first()        if not obj:            return redirect('/app/login/')        if password == obj.pwd:            res = redirect('/app/index/')            res.set_cookie('username',username)            return res        else:            return redirect('/app/login/')def auth(func):    def inner(request,*args,**kwargs):        res = request.COOKIES.get('username')        if not res:            return redirect('/app/login/')        return func(request,*args,**kwargs)    return innerfrom django import viewsfrom django.utils.decorators import method_decorator#三种方式:在每个函数上加,在dispatch上加,在类上加装饰器method_decorator(auth,name='dispatch')class Order(views.View):    # @method_decorator(auth)    # def dispatch(self, request, *args, **kwargs):    #     return super(Order, self).dispatch(request, *args, **kwargs)    # @method_decorator(auth)    def get(self,request):        res = request.COOKIES.get('username')        # if not res:        #     return redirect('/app/login/')        return render(request,'index.html',{
'data':res})
views.py

django之Form组件

django中的Form一般有两种功能:

  • 输入html
  • 验证用户输入
from django import formsclass FM(forms.Form):    user = forms.CharField(error_messages={
'required':'用户名不能为空'}) email = forms.CharField(error_messages={
'required':'邮箱不能为空','invalid':'邮箱格式错误'}) pwd = forms.CharField(max_length=12,min_length=6,error_messages={
'required':'密码不能为空','max_length': '最大长度不能超过12','min_length': '最小长度不能低于6'})def test_form(request): if request.method == 'GET': obj = FM() return render(request,'test_form.html',{
'obj':obj}) elif request.method == 'POST': obj = FM(request.POST) r1 = obj.is_valid() if r1: print(obj.cleaned_data) Person.objects.create(**obj.cleaned_data) else: print(obj.errors) # print(obj.errors.as_json()) # print(obj.errors['user'][0]) return render(request,'test_form.html',{
'obj':obj}) return render(request,'test_form.html')
views.py
    
Title{#
#}{# {
% csrf_token %}#}{#

{

{ obj.errors.user.0 }}

#}{#

{

{ obj.errors.email.0 }}

#}{#

{

{ obj.errors.pwd.0 }}

#}{#
#}{#
#}{#
#}{# {
% csrf_token %}#}{#

{

{ obj.user }}{
{ obj.errors.user.0 }}

#}{#

{

{ obj.email }}{
{ obj.errors.email.0 }}

#}{#

{

{ obj.pwd }}{
{ obj.errors.pwd.0 }}

#}{#
#}{#
#}
{
% csrf_token %}{# 方式一#}{# {
{ obj.as_p }}#}{# 方式二#}{# {
{ obj.as_ul }}#}{# 方式三#}
{
{ obj.as_table }}
前端页面

 PS:以后使用的时候将forms改成fields,fields里面有一个插件widget,可以定制样式

from django import formsfrom django.forms import fieldsfrom django.forms import widgetsclass FM(forms.Form):    user = fields.CharField(error_messages={
'required':'用户名不能为空'},widget=widgets.Textarea(attrs={ 'class':'c1' })) email = fields.CharField(error_messages={
'required':'邮箱不能为空','invalid':'邮箱格式错误'},widget=widgets.PasswordInput) pwd = fields.CharField(max_length=12,min_length=6,error_messages={
'required':'密码不能为空','max_length': '最大长度不能超过12','min_length': '最小长度不能低于6'})def test_form(request): if request.method == 'GET': obj = FM() return render(request,'test_form.html',{
'obj':obj}) elif request.method == 'POST': obj = FM(request.POST) r1 = obj.is_valid() if r1: print(obj.cleaned_data) Person.objects.create(**obj.cleaned_data) else: print(obj.errors) # print(obj.errors.as_json()) # print(obj.errors['user'][0]) return render(request,'test_form.html',{
'obj':obj}) return render(request,'test_form.html')
views.py

 详细内容参考:

跨站请求伪造

一、简介

  django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

  • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

二、应用

1、普通表单

html中设置Token:{
% csrf_token %}
View Code

2、Ajax请求

    
Title
{
% csrf_token %}
View Code

转载于:https://www.cnblogs.com/wusir66/p/10183079.html

你可能感兴趣的文章
浙江省第十二届省赛 Beauty of Array(思维题)
查看>>
NOIP2013 提高组 Day1
查看>>
cocos2dx 3.x simpleAudioEngine 长音效被众多短音效打断问题
查看>>
存储(硬件方面的一些基本术语)
查看>>
观察者模式
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
Win磁盘MBR转换为GUID
查看>>
大家在做.NET B/S项目的时候多用什么设技术啊?
查看>>
Java SE和Java EE应用的性能调优
查看>>
Android设计模式系列--原型模式
查看>>
免费的论文查重网站
查看>>
C语言程序第一次作业
查看>>
leetcode-Sort List
查看>>
中文词频统计
查看>>
了解node.js
查看>>
想做移动开发,先看看别人怎么做
查看>>
Eclipse相关集锦
查看>>
虚拟化架构中小型机构通用虚拟化架构
查看>>
继承条款effecitve c++ 条款41-45
查看>>
Java泛型的基本使用
查看>>