day63 Pyhton 框架Django 06
内容回顾
1.装饰器
装饰器:是一个闭包函数,在不改变原函数的代码和调用方式的基础上,给原函数增加功能。
def wrapper(func):
def inner(*args,**kwargs):
# 原函数执行之前
ret = func(*args,**kwargs)
# 原函数执行之后
return ret
return inner
@wrapper # func1 = wrapper(func1)
def func1():
print('func1')
带参数的装饰器:
def outer(flag):
def wrapper(func):
def inner(*args,**kwargs):
# 原函数执行之前
ret = func(*args,**kwargs)
# 原函数执行之后
return ret
return inner
return wrapper
@outer(True) # outer(True) ——》 @wrapper func1 =wrapper(func1)
def func1():
print('func1')
多个装饰器装饰同一个函数
def w1(func):
def inner(*args,**kwargs):
# 原函数执行之前
ret = func(*args,**kwargs)
# 原函数执行之后
return ret
return inner
def w2(func):
def inner(*args,**kwargs):
# 原函数执行之前
ret = func(*args,**kwargs)
# 原函数执行之后
return ret
return inner
@w1 # func1=w1(func1) w1.inner
@w2 # func1 =w2(func1) w2.inner
def func1():
print('func1')
ret = func1() # 原函数的返回值
装饰器的修复技术
from functools import wraps
def wrapper(func):
@wraps(func)
def inner(*args,**kwargs):
# 原函数执行之前
ret = func(*args,**kwargs)
# 原函数执行之后
return ret
return inner
模板中自定义方法
1. 在app下创建一个叫templatetags的python包
2. 在包内创建python文件 *( my_tags.py)
3. 在python文件中写固定的内容:
from django import template
register = template.Library()
1. 写函数 加装饰器
# filter
@register.filter
def x1(value,arg='xxx'):
return True
# simple_tag
@register.simple_tag
def x2(*args,**kwargs):
return True
@register.inclusion_tag('li.html')
def show_li(num):
return {'num':range(num)}
1. inclusion_tag写模板
<ul>
{% for foo in num %}
<li> {{ foo }}</li>
{% endfor %}
</ul>
使用:
在模板中使用:
{% load my_tags %}
{{ 'alex'|x1:'very' }} # True 可以用在if判断中
{% x2 'a' k1='v1' %}
{% show_li 3 %}
<ul>
<li> 0</li>
<li> 1</li>
<li> 2</li>
</ul>
今日内容
视图
1. FBV CBV
FBV : function based view
CBV : class based view
定义:
from django.views import View
class AddPublisher(View):
def get(self,request):
return response
def post(self,request):
return response
使用:
url(r'^add_publisher/', views.AddPublisher.as_view()),
2. CBV的流程:
1. 程序运行的时候AddPublisher.as_view()执行,得到view函数
url(r'^add_publisher/', view),
2. 请求到来的时候,执行view函数:
1. 实例化AddPublisher ——》 self
2. self.request = request
3. 执行 self.dispatch(request, *args, **kwargs)
1. 判断请求方式是否被允许:
1. 如果允许:通过反射获得相应请求方式的方法 ——》handler
2. 如果不允许:self.http_method_not_allowed ——》handler
2. 执行handler ——》 返回响应
3. 加装饰器
1. FBV 直接加装饰器即可
2. CBV
from django.utils.decorators import method_decorator
# 1。加载某一个方法上
@method_decorator(timer)
def get(self, request):
# 2. 加载dispatch方法上面
@method_decorator(timer)
def dispatch(self, request, *args, **kwargs):
# 3. 加在类上
@method_decorator(timer, 'post')
@method_decorator(timer, 'get')
class AddPublisher(View):
4. 是否使用method_decorator的区别
func : <function AddPublisher.get at 0x00000000042CF158>
args: (<app01.views.AddPublisher object at 0x000000000440E898>, <WSGIRequest: GET '/add_publisher/'>)
func : <function method_decorator.<locals>.dec.<locals>.wrapper.<locals>.bound_func at args: 0x00000000045C71E0>
(<WSGIRequest: GET '/add_publisher/'>,)
5. 上传文件
1. form表单指定编码方式enctype="multipart/form-data"
2. 从request.FILES中 文件对象
3. f1.chunks() # 大文件使用
6. requerst对象
print(request.method) # 请求方式 GET POST PUT
print(request.GET) # URL携带的参数 { ‘name’: ['alex'] } [] .get('name')
print(request.POST) # POST请求提交的数据 { ‘name’: ['alex'] } .getlist()
print(request.path_info) # 路径信息 不包含ip和端口 参数
print(request.FILES)
print(request.META)#请求头内容
print(request.COOKIES)
print(request.session)
print(request.get_host())
print(request.get_full_path()) # 路径信息 不包含ip和端口 带参数
print(request.is_ajax()) # 判断是否是ajax请求
7. reponse对象
HttpResponse('字符串 ') ——》 页面展示 字符串
render(request,'html文件名', { k1:v1 }) ——》 返回一个完整HTML页面
redirect(’要跳转的地址‘) ——》重定向 Location : 地址
JsonResponse:
from django.http import JsonResponse
def json_data(request):
data = {'id': 11, 'name': 'alex'}
l1 = ['alex', 'peiqi']
return JsonResponse(l1, safe=False) # Content-Type: application/json
路由
分组
url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog),
django会把获取到的参数当做位置参数传递给视图函数
命名分组
url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog),
django会把获取到的参数当做关键字参数传递给视图函数
include
from django.conf.urls import url, include
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
]
day63 Pyhton 框架Django 06的更多相关文章
- pyhton框架Django之cookie和session
一,cookie和session的理解 cookies 是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies.它保存在浏览器下的某个文 ...
- day64 Pyhton 框架Django 07
day67 内容回顾 视图 1. CBV 定义 from django.views import View class Addpub(View): def get(self,request): sel ...
- day62 Pyhton 框架Django 05
内容回顾 1.变量 render(request,'模板文件名',{ k1:v1 }) {{ k1 }} {{ list.0 }} {{ dict.key }} {{ dict.keys }} {{ ...
- day61 Pyhton 框架Django 04
内容回顾 1.django处理请求的流程: 1. 在浏览器的地址栏输入地址,回车发get请求: 2. wsgi模块接收请求: 3. 在urls.py文件中匹配地址,找到对应的函数: 4. 执行函数,返 ...
- day60 Pyhton 框架Django 03
day61 内容回顾 1.安装 1. 命令行: pip install django==1.11.18 pip install django==1.11.18 -i 源 2. pycharm sett ...
- day58 Pyhton 框架Django 01
内容回顾 python基础 网路编程 并发编程 数据库 前端 osi7层 tcp/ip 5层模型 应用层 表示层 ...
- python运维开发(十七)----jQuery续(示例)web框架django
内容目录: jQuery示例 前端插件 web框架 Django框架 jQuery示例 dom事件绑定,dom绑定在form表单提交按钮地方都会绑定一个onclick事件,所有查看网站的人都能看到代码 ...
- Web框架——Django笔记
Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序 ...
- Python3.5学习十八 Python之Web框架 Django
Python之Web框架: 本质:Socket 引用wsgiref创建web框架 根据web框架创建过程优化所得: 分目录管理 模板单独目录 执行不同函数单独存入一个方法py文件 Web框架的两种形式 ...
随机推荐
- 同样是logback1.11,更换了log配置后,无论是否有线程持续不断写入log文件,log文件会按设定以日期序号轮换
上次发现了logback1.11的一个bug,即有线程持续写入log,则log文件不会按设定模式进行轮换. 但发现同样采用logback1.11的另外一个工程,它的日志文件就没有错误,于是参照其配置文 ...
- pythont多线程
import threading # 线程模块 def function(num): pass thread_1 = threading.Thread(target=function, args=(1 ...
- Euclid's Game(POJ 2348)
原题如下: Euclid's Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10832 Accepted: 4 ...
- liunx配置本地yum源和更新aliyun yum源
1.挂载DVD光盘到/mnt 因为配置时候路径名里面不能有空格,否则不能识别 [root@ mnt]# mount /dev/cdrom /mnt [root@ mnt]# umount ...
- oracle之网络
Oracle 网络 sqlplus sys/123123@192.168.143.90:1521/urpdb as sysdba 15.1 Oracle Net 基本要素: 15.1.1 服务器端的l ...
- [深入理解JVM虚拟机]第2章-Java内存区域与内存溢出异常
2.0引-Java内存区域中,栈内存和堆内存分别装什么,为什么? 栈:解决程序的运行问题,即程序如何执行,或者说如何处理数据. 堆:解决的是数据存储的问题,即数据怎么放,放在哪儿. 参考链接https ...
- [剑指Offer]17-打印从1到最大的n位数(递归)
题目 如题,输入n,则从1打印至99. 题解 考虑到n比较大会有大数问题,所以使用字符数组存储数. 由题可用递归求n位全排列,即为所得. 具体地,用临时字符数组用来存答案,每次递归填好一位,都填好后输 ...
- Fork Join 并发任务执行框架
Fork Join 体现了分而治之 什么是分而治之? 规模为N的问题,如果N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原 ...
- 谈谈 Java 中的那些“琐”事
一.公平锁&非公平锁 是什么 公平锁:线程按照申请锁的顺序来获取锁:在并发环境中,每个线程都会被加到等待队列中,按照 FIFO 的顺序获取锁. 非公平锁:线程不按照申请锁的顺序来获取锁:一上来 ...
- 操作系统(AIX)双因素身份认证解决方案-中科恒伦CKEY DAS
一.场景分析 操作系统是管理计算机硬件与软件资源的计算机程序,用于工作中的进程管理.存储管理.设备管理.文件管理.作业管理等,十分重要,安全等级极高! 二.问题分析 1.密码设置简单,非常容易被撞 ...