python与flask不得不说的小秘密

常识引入

  1. 什么是装饰器?

    在不改变源码的前提下,对函数之前前后进行功能定制.
    
    开放封闭原则:不改变函数内部代码,在函数外部进行修改.
  2. 基本写法

    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"
  3. 函数应用多个装饰器

    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不得不知的基础的更多相关文章

  1. Flask 框架中 上下文基础理念,包括cookie,session存储方法,requset属性,current_app模块和g模块

    Flask中上下文,分为请求上下文和应用上下文.既状态留存 ,就是把变量存在某一个地方可以调用 请求上下文:实际就是request和session用法理念,既都是可以存储东西. 应用上下文:既变量共享 ...

  2. flask系列二之基础知识

    一.调试模式(debug模式) 1.设置debug模式 在app.run()中传入关键字参数debug,app.run(debug=Ture),就设置当前项目为debug模式.如下所示: # 从fla ...

  3. Kafka面试你不得不知道的基础知识

    Java内存管理面试指南一 Java基础面试指南一 Java基础面试指南二 Java基础面试指南三 Java基础面试指南四 Java线程面试指南一 Java线程面试指南二 Redis面试指南一 Kaf ...

  4. [不得不知道系列]Java线程面试你不得不知道的基础知识一

    Java内存管理面试指南一 Java基础面试指南一 Java基础面试指南二 Java基础面试指南三 Java基础面试指南四 Java线程面试指南一 Java线程面试指南二 Redis面试指南一 Kaf ...

  5. Python3基础教程(二十)—— flask介绍

    基本概念 什么是Flask? Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 web 应用程序可以是一些 web 页面.博客.w ...

  6. 超实用的Flask入门基础教程,新手必备!

    Flask入门基础教程 Flask简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活.轻便.安全且容易上手.它可以很好地结合MVC模式进行开发,开发人员分工合 ...

  7. python的Flask 介绍

    Flask 介绍 知识点 微框架.WSGI.模板引擎概念 使用 Flask 做 web 应用 模板的使用 根据 URL 返回特定网页 实验步骤 1. 什么是 Flask? Flask 是一个 web ...

  8. Flask第三方工具组件介绍

    flask-wtf组件flask-login组件flask-session组件flask-sqlalchemy组件flask-script组件flask-cache组件flask-assets组件fl ...

  9. Flask自带的常用组件介绍

    Flaskrender_templatesessionurl_forredirectflashmake_responsejsonifyblueprintrequestabortgsend_from_d ...

随机推荐

  1. ES使用org.elasticsearch.client.transport.NoNodeAvailableException: No node available

    1) 端口错 client = new TransportClient().addTransportAddress(new InetSocketTransportAddress(ipAddress, ...

  2. proc文件系统详解

    /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux内核空间和用户间之间进行通信.在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段, ...

  3. unittest简单使用的介绍

    无论是paython+request接口测试.ui自动化测试等,都常会用到unittest的框架,简单的介绍如下:

  4. 51nod 1594 Gcd and Phi 反演

    OTZ 又被吊打了...我当初学的都去哪了??? 思路:反演套路? 提交:\(1\)次 题解: 求\(\sum_{i=1}^{n}\sum_{j=1}^{n}\varphi(gcd(\varphi(i ...

  5. 【题解】[Usaco2007 Open]Catch That Cow 抓住那只牛-C++

    题目DescriptionFarmer John has been informed of the location of a fugitive cow and wants to catch her ...

  6. springboot项目没错,但就是报红叉

    1.报错原因: Description Resource Path Location TypeCannot change version of project facet Dynamic Web Mo ...

  7. [USACO15DEC] 最大流Max Flow && Tarjan 线性 LCA 教学?

    题面 显然是树上差分模板题啦,不知道树上差分的童鞋可以去百度一下,很简单. 然后顺带学了一下 tarjan 的 O(N+Q) 离线求LCA的算法 (准确的说难道不应该带个并查集的复杂度吗???) 算法 ...

  8. laotech老师唠科mac 深入浅出MAC OS X ceshi ruguokeyi

    laotech老师唠科mac 深入浅出MAC OS X http://study.163.com/plan/planLearn.htm?id=1637004#/learn/resVideo?lesso ...

  9. 前端逼死强迫症系列之css

    一.编写css样式 1.ID选择器 由于ID唯一,所以也是写多遍. <head> <style> #i1{ background-color: #2459a2; height: ...

  10. Mongodb java.util.NoSuchElementException:null 已解决

    public static String find(){ String a=""; try{ MongoCollection<Document> collection ...