python与flask不得不说的小秘密

常识引入

  1. 什么是装饰器?

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

    1. import functools
    2. def wrapper(func):
    3. @functools.wraps(func)
    4. def inner(*args, **kwargs):
    5. return func(*args, **kwargs)
    6. return inner
    7. @wrapper
    8. def index(xx):
    9. pass
    10. @wrapper
    11. def order(xx):
    12. pass
    13. print(index.__name__) # "inner"
    14. print(order.__name__) # "inner"
  3. 函数应用多个装饰器

    1. import functools
    2. def wrapper1(func):
    3. @functools.wraps(func)
    4. def inner(*args, **kwargs):
    5. print('w1')
    6. return func(*args, **kwargs)
    7. return inner
    8. def wrapper2(func):
    9. @functools.wraps(func)
    10. def inner(*args, **kwargs):
    11. print('w2')
    12. return func(*args, **kwargs)
    13. return inner
    14. @wrapper1
    15. @wrapper2
    16. def index():
    17. print('index')
    18. index()

flask和django不得不公布的绯闻

1.flask和django的区别?

  1. flask,是一个轻量级的框架,内置了:路由/视图/模板(jinja2)/cookie/session/中间件. 可扩展强,第三方组件非常多,例如:wtforms/flask-session/flask-sqlalchemy.
  2. django,是一个重武器,django内置了很多功能方便我们使用,例如:admin/orm/模板/form/modelform/session/cookie/中间件/路由/缓存/信号/数据库的读写分离/分页...
  1. flask,短小精悍可扩展强.
  2. django,大而全重武器.
  • django好还是flask好?

    1. 小程序,flask比较好.
    2. 中大型,django比较好.

2.快速入门

  1. pip3 install flask

2.1 werkzurg

werkzurg是一个wsgi,本质上提供了socket服务端,用于接收用户请求.

django和flask一样,它们内部都没有实现socket服务端,需要依赖wsgi.

  • django, wsgiref
  • flask, werkzurg

2.1.1 wsgiref实现一个网站

  1. from wsgiref.simple_server import make_server
  2. class WSGIHandler(object):
  3. def __call__(self,environ, start_response):
  4. start_response('200 OK', [('Content-Type', 'text/html')])
  5. return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
  6. if __name__ == '__main__':
  7. obj = WSGIHandler()
  8. httpd = make_server('127.0.0.1', 8000, obj)
  9. httpd.serve_forever()

2.1.2 werkzeug实现一个网站

  1. from werkzeug.wrappers import Response
  2. from werkzeug.serving import run_simple
  3. class Flask(object):
  4. def __call__(self,environ, start_response):
  5. return Response('Hello World!')(environ, start_response)
  6. if __name__ == '__main__':
  7. app = Flask()
  8. run_simple('127.0.0.1', 5000, app)

2.2 flask程序

  1. from flask import Flask
  2. # 实例化了一个Flask对象
  3. app = Flask(__name__)
  4. # 添加路由关系
  5. @app.route('/index')
  6. def index():
  7. return '你好'
  8. if __name__ == '__main__':
  9. # 启动服务端
  10. app.run()

3.flask用户登陆实例

关于返回值

  1. ```python
  2. from flask import Flask,render_template,request,redirect
  3. app = Flask(__name__)
  4. @app.route('/login',methods=['GET','POST'])
  5. def login():
  6. return "xxx"
  7. return render_template('模板文件',参数)
  8. return redirect(...)
  9. return jsonify({"k1":123})
  10. if __name__ == '__main__':
  11. app.run()
  12. ```

关于模板

  1. ```
  2. 默认放在根目录的tempaltes文件夹下
  3. ```

关于用户请求

  1. ```
  2. request.method
  3. request.form # POST请求传来的数据
  4. request.args # GET url中的参数信息
  5. ```

session

  1. ```
  2. 加密的形式放在用户浏览器的cookie中.
  3. # 登录操作
  4. from flask import request, session
  5. app.secret_key = 'sasashasalks'
  6. @app.route('/login', methods=['POST', 'GET'])
  7. def login():
  8. if request.method == 'POST':
  9. if request.form['user'] == 'admin':
  10. session['user'] = request.form['user']
  11. return 'Hello World!'
  12. else:
  13. return 'No such user!'
  14. if 'user' in session:
  15. return 'Hello %s!' % session['user']
  16. else:
  17. title = request.args.get('title', 'Default')
  18. return render_template('login.html', title=title)
  19. ```

在flask视图中添加装饰器

  1. - 位置route的下面
  2. - 记得加functools.wraps(...) , 保留函数的元信息.

特殊装饰器:before和after request装饰器

  1. ```
  2. # 主要的是,执行顺序:before_request在视图函数执行前顺序执行,after_request在函数执行后,逆序执行(flask内部会先对after_request列表进行逆序再执行)
  3. from flask import Flask,render_template,request,redirect,jsonify,url_for,session
  4. import functools
  5. app = Flask(__name__)
  6. app.secret_key = "29ualknd872iuknsdgf"
  7. @app.before_request
  8. def f1():
  9. print('f1')
  10. @app.before_request
  11. def f11():
  12. print('f11')
  13. @app.after_request
  14. def f2(response):
  15. print('f2')
  16. return response
  17. @app.after_request
  18. def f22(response):
  19. print('f22')
  20. return response
  21. @app.route('/login')
  22. def login():
  23. print('login')
  24. return 'Login'
  25. @app.route('/index')
  26. def index():
  27. print('index')
  28. return 'index'
  29. if __name__ == '__main__':
  30. app.run()
  31. # 显示顺序:
  32. f1 f11 f22 f2 f1 f11 f22 f2
  33. ```

4. 路由中的重要参数

  1. # 主要的
  2. endpoint="" 默认是函数名, 可以在app.route()的关键字参数中定义,默认是对应的函数名,当登陆验证使用装饰器时,应注意装饰器的inner函数名会影响路由的解析,所以再装饰其中要使用funcktools.wraps(...)来保留原函数信息
  3. url_for("") 反向地址, 通过视图函数名, endpoint解析对应的URL
  4. methods=[] 该视图函数能处理的请求方式, 默认是GET, 当重新定义了methods, 那么默认的GET也会被覆盖
  5. # 一般的
  6. defaults={} 给视图函数传递参数, 可以作为默认参数, 传了就必须的接
  7. strict_slashes=Bool 严格的使用"/", URL中没有"/", 访问时也不能有, URL中有"/", 你访问时没有, 会通过301进行永久重定向
  8. redirect_to="" 永久重定向
  9. # 动态路由参数
  10. '/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. watch 监控的新旧值一致问题处理

    watch 监控的新旧值一致问题处理 http://www.imooc.com/article/details/id/286654

  2. 字符串的新方法——includes() padStart() padEnd()

    ES6为字符串提供了一个新方法,叫做String.prototype.includes('要包含的字符串'),如果包含,则返回字符串,否则返回false 使用ES6中的字符串新方法String.pro ...

  3. JAVA遇见HTML——JSP篇(JSP内置对象下)

    request.getSession() 网上资料解释: request只能存在于一次访问里 session对象的作用域为一次会话 session长驻在服务器内存里,session有id标识,一个se ...

  4. C# Parallel 使用

    ParallelLoopResult result = Parallel.For(, , i => { Console.WriteLine("{0}, task: {1}, threa ...

  5. sql 存储过程记录

    -- exec sp_helptext add_book1 CREATE proc add_book1 --创建存储过程 @DocCode VARCHAR() --创建参数 as BEGIN INSE ...

  6. c实现单向链表

    实现一个单向链表的:创建.插入.删除.排序(冒泡).逆向.搜索中间节点 #include <iostream> #include <stdio.h> #include < ...

  7. python常用模块(不定期更新)

    前言: 随着python开发项目越来越大,显然应该把不同功能的代码放到不同的.py文件里,每一个.py文件叫一个模块:模块分为(1)内置标准模块(2)第三方模块(3)自定义模块 这三种.这篇博客就是用 ...

  8. 7月清北学堂培训 Day 2

    今天是林永迪老师的讲授~ 继续昨日的贪心内容. 我们继续看例题: 分析样例的过河方法: 首先1和2先过河,总时间为2: 然后1回来,总时间为3: 然后5和10过河,总时间为13: 然后2回来,总时间为 ...

  9. 一个XP SP3调用0地址蓝屏BUG

    0x00 蓝屏的堆栈 在XP SP3上跑POC之后,一段时间之后会出现蓝屏,蓝屏的堆栈如下,可以看出是ACKData里面CALL了一个0指针导致的蓝屏 0x01 蓝屏原因 1 ETW(Event Tr ...

  10. chip based learning

    chip types Transistor mode of operation Digital chip: 0/1  -> digital clac Analog chip: sound / b ...