Python学习---django知识补充之CBV

Django知识补充之CBV

Django:

url    -->  def函数      FBV[function based view]  用函数和URL进行匹配

url    -->  类           CBV[function based view]  用类和URL进行匹配

POSTMAN插件

http://blog.csdn.net/zzy1078689276/article/details/77528249

基于CBV的登录实例:

settings.py

INSTALLED_APPS = [
   ...
 ‘app01‘,   # 注册app
]
STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),)  # 现添加的配置,这里是元组,注意逗号
TEMPLATES = [
   ...
   ‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘)],
]

urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from app01 import views
urlpatterns = [
   # 基于CBV的登录
 # url(r‘^login.html/‘, views.login),  # 原来基于函数
   url(r‘^login.html/‘, views.Login.as_view()), # 现在基于类名.as_view()
]

views.py

from django.shortcuts import render, redirect
from app01 import models
# 基于CBV的登录,需要导入views
from django import views
class Login(views.View):
    # http_method_names = [‘get‘, ‘post‘, ‘put‘, ‘patch‘, ‘delete‘, ‘head‘, ‘options‘, ‘trace‘]
    def get(self, request, *args, **kwargs):
        print(request.method, ‘GGGGGGGGGGGG‘)
        message = ‘‘
        return render(request, ‘login.html‘, {‘message‘: message})  # 这里是网页html
    def post(self, request, *args, **kwargs):
        print(request.method, ‘OOOOOOOOOOOOO‘)
        username = request.POST.get("user")
        password = request.POST.get("pass")
        print(‘username: %s, password:%s‘ % (username, password))
         # obj = models.Administrator.objects.filter(username=username, password=password).count()
        # if obj:   从数据库内取出数据,进行判断也可以
        if username == ‘root‘ and password == ‘root‘:
            req = redirect(‘/index.html/‘)  # 接收redirect对象,# 这里是浏览器路径,伪静态
            # req.set_cookie(‘username‘, username, max_age=10)  # 设置超时时间10s
            import datetime
            timeout = datetime.datetime.now() + datetime.timedelta(seconds=10)
            req.set_cookie(‘username‘, username, max_age=10, expires=timeout)
            # IE设置超时时间10s
            return req
            # return redirect(‘/index.html‘) # 与上面3行同,只是添加了Cookie
        else:
            message = ‘用户名或密码错误‘
            return render(request, ‘login.html‘, {‘message‘: message})  # 这里是网页html

templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {# 伪静态#}
    <form action="/login.html/" method="post">
        {% csrf_token %}   {# 为跨站请求 #}
        <div>
            <label for="user">用户名</label>
            <input id="user" name="user" type="text">
        </div>
        <div>
            <label for="pass">密&nbsp;&nbsp;&nbsp;&nbsp;码</label>
            <input id="pass" name="pass" type="password">
        </div>
        <div>
            <label></label>
            <input value="登录" type="submit">
            <span style="color: red">{{ message }}</span>
        </div>
    </form>
</body>
</html>

templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h2>hello, {{ username }}</h2>
</body>
</html>

页面显示:

CBV基于装饰器的使用<一>  ---基于Python旧方法

 

CBV基于装饰器的使用<一>  ---基于Python旧方法

装饰器:函数执行之前/后可以增加扩展功能

有多个方法的时候,必须给每个方法添加装饰器哈

CBV的反射原理

单一装饰器

views.py

from django.shortcuts import render, redirect
from app01 import models
# 基于CBV的登录,需要导入views
from django import views
from django.utils.decorators import method_decorator  # 导入装饰器
# 基于CBV的装饰器的使用
def outer(func):
    def inner(request, *args, **kwargs):
        print(request.method)
        return func(request, *args, **kwargs)
    return inner

class Login(views.View):
    # http_method_names = [‘get‘, ‘post‘, ‘put‘, ‘patch‘, ‘delete‘, ‘head‘, ‘options‘, ‘trace‘]
    @method_decorator(outer)
    def get(self, request, *args, **kwargs):
        message = ‘‘
        return render(request, ‘login.html‘, {‘message‘: message})  # 这里是网页html

    @method_decorator(outer)
    def post(self, request, *args, **kwargs):
        username = request.POST.get("user")
        password = request.POST.get("pass")
        print(‘username: %s, password:%s‘ % (username, password))
        # obj = models.Administrator.objects.filter(username=username, password=password).count()
        # if obj:   从数据库内取出数据,进行判断也可以
        if username == ‘root‘ and password == ‘root‘:
            req = redirect(‘/index.html/‘)  # 接收redirect对象,# 这里是浏览器路径,伪静态
            # req.set_cookie(‘username‘, username, max_age=10)  # 设置超时时间10s
            import datetime
            timeout = datetime.datetime.now() + datetime.timedelta(seconds=10)
            req.set_cookie(‘username‘, username, max_age=10, expires=timeout)
            # IE设置超时时间10s
            return req
            # return redirect(‘/index.html‘) # 与上面3行同,只是添加了Cookie
        else:
            message = ‘用户名或密码错误‘
            return render(request, ‘login.html‘, {‘message‘: message})  # 这里是网页html

CBV基于装饰器的使用<二>  --基于Django的dispatch[多个装饰器]

CBV基于装饰器的使用<二>  --基于Django的dispatch[多个装饰器]

如果对某一种请求做处理: 单一装饰器

如果对所有的请求做处理: dispatch单一装饰器

添加装饰器有2中方法:

1.类上添加

2.方法上添加

自定义转发dispatch函数

from django import views
from django.utils.decorators import method_decorator  # 导入装饰器
class Login(views.View):
    # http_method_names = [‘get‘, ‘post‘, ‘put‘, ‘patch‘, ‘delete‘, ‘head‘, ‘options‘, ‘trace‘]
    # 自定义转发器,URL进来都在此处进行URL转发,我们可以有一些预操作[函数验证可以放此处]
    def dispatch(self, request, *args, **kwargs):
        print(‘自定义dispatch: 前‘)
        # if request.method == ‘POST‘:
            # return HttpResponse("Good Bye")    # 预操作处理
        # 请求先到Login的dispatch,然后调用父类的dispatch,返回结果给了obj
        obj = super(Login, self).dispatch(request, *args, **kwargs)  # 自定义转发且调用父类dispatch
        # 将父类的返回结果返回给界面,否则界面报错
        print(‘自定义dispatch: 后‘)
        return obj

    def get(self, request, *args, **kwargs):
        message = ‘‘
        return render(request, ‘login.html‘, {‘message‘: message})  # 这里是网页html
        ...同上

原文地址:https://www.cnblogs.com/ftl1012/p/9403851.html

时间: 2024-11-06 02:02:16

Python学习---django知识补充之CBV的相关文章

[python]学习Django中的python知识拾遗

1.使用正则表达式进行URL匹配 urlpatterns = patterns('', # ... (r'^time/plus/\d+/$', hours_ahead), # ... ) (1)使用r代表字符串是原始字符串,表示python不会对立面的反斜杠\转义符进行处理,使用正则表达式一般使用原始字符串. (2)使用\d+表示匹配1个或者多个数字,如果限定只能使用两个数字,则\d{1,2}. (3)如果要把正则表达式的某个数作为参数,则用小括号包起来,如(r'^time/plus/(\d{1

Python学习---django下的cookie操作 180201

什么是Cookies 什么是Cookies cookies设置的原因: 1. http请求的无记忆性: 2.加快访问速度  3. 减少服务器压力 cookies特点: cookies保存在客户端浏览器上的键值对,且每次访问页面都会带着cookies cookies可以主动清除 cookies也可以被"伪造",可以被别人带着cookies操作你的账号 cookies会根据域名进行分类,不能跨域共享,也就是说百度有百度的,JD有京东的 cookies必须请求数据成功后才能有用哈 浏览器可以

Django知识补充

一.文件上传 1.三种方式 通过form表单提交实现基本上传 通过From类上传 ajax上传 from django.shortcuts import render,HttpResponse from django import forms from django.forms import fields class UploadForm(forms.Form): user = fields.CharField() img = fields.FileField() def upload(requ

[Python学习] Django 权限控制

本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 主要内容 什么是权限管理? Web 权限 Django 权限机制 Django 的权限项 权限应用 Permission(一) Permission(二) User Permission 管理(一) User Permission 管理(二) Group Permission 管理 权限验证(一) 权限验证(二) 权限验证(三) 权限验证(四) 什么是权限管理 权限管理,一般指

Python学习---django之ORM的增删改查180125

模型常用的字段类型参数 <1> CharField        #字符串字段, 用于较短的字符串.        #CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.<2> IntegerField       #用于保存一个整数.<3> FloatField        # 一个浮点数. 必须 提供两个参数:    参数    描述        # max_digits    总位数(不

Python学习---Django的新工程设置模板

该模板完全可以在创建好新工程后进行部分代码替换 创建app01的  python startapp app01 创建static子目录 settings.py """ Django settings for user_manager project. Generated by 'django-admin startproject' using Django 2.0.1. For more information on this file, see https://docs.d

python学习--Django虚拟环境搭建

一 . 为什么选择搭建虚拟环境 搭建一个只对本次项目有用的虚拟环境,而不影响主环境 二 . 安装前准备 #    1. 安装 python #    2. 安装virtualenvwrapper #    3. 虚拟环境相关操作 #    4. 进入虚拟环境, 安装django #    5. 安装编辑器 #    6. 安装mysql #    7. 安装pymysql 三 . 虚拟环境的安装 virtualenv 虚拟环境安装  pip install virtualenv 创建虚拟环境 v

python学习之模块补充二

1.logging 模块 1.1 logging模块的基本配置 import logging logging.basicConfig( # 1.日志输出位置:1.终端 2.文件 filename='access.log', # 不指定,默认打印到终端 # 2.日志格式 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', # 3.时间格式 datefmt='%Y-%m-%d %H:%M:%S %p',

Python学习基础知识概要

1.输入输出 输出实例 1 2 print 'hello','world' hello world 输入实例 1 2 3 4 5 name = raw_input(); print "hello,",name world hello,world 输入时提示实例 1 2 3 4 5 name = raw_input('please enter your name:'); print "hello,",name please enter your name:world