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. Robot Framework--运行pybot时出错

    1.在Execution Profile中选择 pybot,点击 start,报错,找不到指定文件 2.在cmd中运行pybot.bat也是报错---pybot is not define 3.找到p ...

  2. windows下mysql5.6.x的日志正确配置方法(my.ini) (网上的都是5.6之前的版本)

    https://blog.csdn.net/databatman/article/details/49951853 感谢楼主,找了好久,试了一下楼主的,果然是对的,网上的日志配置都是5.6之前的版本: ...

  3. MySQL安装到最后一步未响应MySQL Server Instance Configuration Wizard

    MySQL安装到最后一步未响应 第一个方法: 打开C盘,并且显示隐藏文件,然后在C盘下就能找到一个文件夹叫  "ProgamData"  ,打开它,删除里面的  "mys ...

  4. Property or method "openPageOffice" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by

    Property or method "openPageOffice" is not defined on the instance but referenced during r ...

  5. Display Tag Lib Table进行分页

    Display Tag Lib是一个标签库,用来处理jsp网页上的Table,功能非常强,可以对的Table进行分页.数据导出.分组.对列排序等等,反正我在做项目时需要的功能它都给我提供了,而且使用起 ...

  6. jQuery 操作一览表

    js获取方法要比jq的方法麻烦的多,主要是因为FF浏览器,因为FF浏览器也会把换行当作dom元素,下面跟着小编一起来学习js jquery获取当前元素的兄弟级 上一个 下一个元素的,需要的朋友一起来学 ...

  7. c实现队列

    使用链表实现队列的入队和出队 #include <iostream> #include <stdio.h> #include <string.h> #include ...

  8. python 识别鼠标左键点击

    #coding=utf- import pyHook import pythoncom # 监听到鼠标事件调用 def onMouseEvent(event): if(event.MessageNam ...

  9. Codeforces 1276C/1277F/1259F Beautiful Rectangle (构造)

    题目链接 http://codeforces.com/contest/1276/problem/C 题解 嗯,比赛结束前3min想到做法然后rush不出来了--比赛结束后又写了15min才过-- 以下 ...

  10. 下板不动, 上板匀速平板间流动(Crank-Nicolson格式)【转载】

    摘自<FLUENT流体工程仿真计算实例与分析>,程序略有修改 两个间距为1cm水平平板,如下图所示: 上板匀速平板间流动(Crank-Nicolson格式)[转载]"> 充 ...