flask不得不知的基础
python与flask不得不说的小秘密
常识引入
什么是装饰器?
在不改变源码的前提下,对函数之前前后进行功能定制. 开放封闭原则:不改变函数内部代码,在函数外部进行修改.
基本写法
import functools def wrapper(func):
@functools.wraps(func)
def inner(*args, **kwargs):
return func(*args, **kwargs) return inner @wrapper
def index(xx):
pass @wrapper
def order(xx):
pass print(index.__name__) # "inner"
print(order.__name__) # "inner"
函数应用多个装饰器
import functools def wrapper1(func):
@functools.wraps(func)
def inner(*args, **kwargs):
print('w1')
return func(*args, **kwargs) return inner def wrapper2(func):
@functools.wraps(func)
def inner(*args, **kwargs):
print('w2')
return func(*args, **kwargs) return inner @wrapper1
@wrapper2
def index():
print('index') index()
flask和django不得不公布的绯闻
1.flask和django的区别?
flask,是一个轻量级的框架,内置了:路由/视图/模板(jinja2)/cookie/session/中间件. 可扩展强,第三方组件非常多,例如:wtforms/flask-session/flask-sqlalchemy.
django,是一个重武器,django内置了很多功能方便我们使用,例如:admin/orm/模板/form/modelform/session/cookie/中间件/路由/缓存/信号/数据库的读写分离/分页...
flask,短小精悍可扩展强.
django,大而全重武器.
django好还是flask好?
小程序,flask比较好.
中大型,django比较好.
2.快速入门
pip3 install flask
2.1 werkzurg
werkzurg是一个wsgi,本质上提供了socket服务端,用于接收用户请求.
django和flask一样,它们内部都没有实现socket服务端,需要依赖wsgi.
- django, wsgiref
- flask, werkzurg
2.1.1 wsgiref实现一个网站
from wsgiref.simple_server import make_server
class WSGIHandler(object):
def __call__(self,environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
if __name__ == '__main__':
obj = WSGIHandler()
httpd = make_server('127.0.0.1', 8000, obj)
httpd.serve_forever()
2.1.2 werkzeug实现一个网站
from werkzeug.wrappers import Response
from werkzeug.serving import run_simple
class Flask(object):
def __call__(self,environ, start_response):
return Response('Hello World!')(environ, start_response)
if __name__ == '__main__':
app = Flask()
run_simple('127.0.0.1', 5000, app)
2.2 flask程序
from flask import Flask
# 实例化了一个Flask对象
app = Flask(__name__)
# 添加路由关系
@app.route('/index')
def index():
return '你好'
if __name__ == '__main__':
# 启动服务端
app.run()
3.flask用户登陆实例
关于返回值
```python
from flask import Flask,render_template,request,redirect
app = Flask(__name__)
@app.route('/login',methods=['GET','POST'])
def login():
return "xxx"
return render_template('模板文件',参数)
return redirect(...)
return jsonify({"k1":123})
if __name__ == '__main__':
app.run()
```
关于模板
```
默认放在根目录的tempaltes文件夹下
```
关于用户请求
```
request.method
request.form # POST请求传来的数据
request.args # GET url中的参数信息
```
session
```
加密的形式放在用户浏览器的cookie中.
# 登录操作
from flask import request, session
app.secret_key = 'sasashasalks'
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
if request.form['user'] == 'admin':
session['user'] = request.form['user']
return 'Hello World!'
else:
return 'No such user!'
if 'user' in session:
return 'Hello %s!' % session['user']
else:
title = request.args.get('title', 'Default')
return render_template('login.html', title=title)
```
在flask视图中添加装饰器
- 位置route的下面
- 记得加functools.wraps(...) , 保留函数的元信息.
特殊装饰器:before和after request装饰器
```
# 主要的是,执行顺序:before_request在视图函数执行前顺序执行,after_request在函数执行后,逆序执行(flask内部会先对after_request列表进行逆序再执行)
from flask import Flask,render_template,request,redirect,jsonify,url_for,session
import functools
app = Flask(__name__)
app.secret_key = "29ualknd872iuknsdgf"
@app.before_request
def f1():
print('f1')
@app.before_request
def f11():
print('f11')
@app.after_request
def f2(response):
print('f2')
return response
@app.after_request
def f22(response):
print('f22')
return response
@app.route('/login')
def login():
print('login')
return 'Login'
@app.route('/index')
def index():
print('index')
return 'index'
if __name__ == '__main__':
app.run()
# 显示顺序:
f1 f11 f22 f2 f1 f11 f22 f2
```
4. 路由中的重要参数
# 主要的
endpoint="" 默认是函数名, 可以在app.route()的关键字参数中定义,默认是对应的函数名,当登陆验证使用装饰器时,应注意装饰器的inner函数名会影响路由的解析,所以再装饰其中要使用funcktools.wraps(...)来保留原函数信息
url_for("") 反向地址, 通过视图函数名, 或endpoint解析对应的URL
methods=[] 该视图函数能处理的请求方式, 默认是GET, 当重新定义了methods, 那么默认的GET也会被覆盖
# 一般的
defaults={} 给视图函数传递参数, 可以作为默认参数, 传了就必须的接
strict_slashes=Bool 严格的使用"/", URL中没有"/", 访问时也不能有, URL中有"/", 你访问时没有, 会通过301进行永久重定向
redirect_to="" 永久重定向
# 动态路由参数
'/shopping/<int:year>/<string:month>' 路由中使用参数, 并可以转换参数的数据类型, 切记数字可以转字符串, 字符串不能转数字
flask不得不知的基础的更多相关文章
- Flask 框架中 上下文基础理念,包括cookie,session存储方法,requset属性,current_app模块和g模块
Flask中上下文,分为请求上下文和应用上下文.既状态留存 ,就是把变量存在某一个地方可以调用 请求上下文:实际就是request和session用法理念,既都是可以存储东西. 应用上下文:既变量共享 ...
- flask系列二之基础知识
一.调试模式(debug模式) 1.设置debug模式 在app.run()中传入关键字参数debug,app.run(debug=Ture),就设置当前项目为debug模式.如下所示: # 从fla ...
- Kafka面试你不得不知道的基础知识
Java内存管理面试指南一 Java基础面试指南一 Java基础面试指南二 Java基础面试指南三 Java基础面试指南四 Java线程面试指南一 Java线程面试指南二 Redis面试指南一 Kaf ...
- [不得不知道系列]Java线程面试你不得不知道的基础知识一
Java内存管理面试指南一 Java基础面试指南一 Java基础面试指南二 Java基础面试指南三 Java基础面试指南四 Java线程面试指南一 Java线程面试指南二 Redis面试指南一 Kaf ...
- Python3基础教程(二十)—— flask介绍
基本概念 什么是Flask? Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 web 应用程序可以是一些 web 页面.博客.w ...
- 超实用的Flask入门基础教程,新手必备!
Flask入门基础教程 Flask简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活.轻便.安全且容易上手.它可以很好地结合MVC模式进行开发,开发人员分工合 ...
- python的Flask 介绍
Flask 介绍 知识点 微框架.WSGI.模板引擎概念 使用 Flask 做 web 应用 模板的使用 根据 URL 返回特定网页 实验步骤 1. 什么是 Flask? Flask 是一个 web ...
- Flask第三方工具组件介绍
flask-wtf组件flask-login组件flask-session组件flask-sqlalchemy组件flask-script组件flask-cache组件flask-assets组件fl ...
- Flask自带的常用组件介绍
Flaskrender_templatesessionurl_forredirectflashmake_responsejsonifyblueprintrequestabortgsend_from_d ...
随机推荐
- linux实操_硬盘
1.硬盘分区 硬盘说明: 查看分区和挂载情况 语法: lsblk -f lsblk 2.增加硬盘 (1)虚拟机添加硬盘 (2)分区 fdisk /dev/sdb (3)格式化 mkfs -text4 ...
- BZOJ 1299: [LLH邀请赛]巧克力棒 【SG函数/博弈分析/高斯消元】
因为太懒,放个博客 我只写了O(2n)O(2^n)O(2n)的 CODE #include <cstdio> int n, x[15]; int main () { for(int T = ...
- Tpcc-mysql 结果解读
原文:https://blog.csdn.net/frockee/article/details/87812329 1. 填坑经验 不要使用tidb的tpcc测试程序(非标准,tidb修改过),使 ...
- 五十四.自定义镜像及仓库、持久化存储 、 Docker网络架构
1. 制作自定义镜像(base基础镜像,搭建共性环境) 基于centos镜像使用commit创建新的镜像文件 基于centos镜像使用Dockerfile文件创建一个新的镜像文件 1.1 使用镜像 ...
- 【概率论】1-4:事件的的并集(Union of Events and Statical Swindles)
title: [概率论]1-4:事件的的并集(Union of Events and Statical Swindles) categories: Mathematic Probability key ...
- Ubuntu18.04安装和配置Django,并实现简单示例
一.前言(系统,django介绍,window.mac.linux简单区别) Django是python开发过程最重要的web框架.因为在看的Django教学视频是在mac下安装的,我自己用的是Lin ...
- 使用 nginx_rtmp_module 搭建个人学习流媒体服务器
nginx 共享服务器中的视频 如果服务器处于内网或者没有公网ip,可以使用 相关软件进行打洞或转发 如: frpc https://github.com/fatedier/frp 或 holer h ...
- jira默认是jira_user用户组的用户有登录jira的权限
场景描述: 今天给jira新建了几个用户组,看着英文的jira_user和jira_developer有点多余,所以就给删掉了.然后后面新建了开发人员和测试人员用户组,进行了人员分配和项目分配,可是突 ...
- springboot+druid+sqlite遇到的问题
1.springboot中使用druid查询sqlite报错getFetchDirection error ResultSet closed https://blog.csdn.net/u011943 ...
- Linux设备驱动程序 之 get_free_page
get_free_page 如果模块需要分配大块的内存,使用面向页的分配会有很多优点: 分配页面可使用下面的函数: unsigned long get_zeroed_page(gfp_t gfp_ma ...