flask学习笔记1
Posted hexintong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask学习笔记1相关的知识,希望对你有一定的参考价值。
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
“微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。
默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。
Werzeug
""" from werkzeug.wrappers import Request, Response from werkzeug.serving import run_simple @Request.application def hello(request): return Response(\'Hello World!\') if __name__ == \'__main__\': # 当请求打来之后,自动执行:hello() run_simple(\'localhost\', 4000, hello) """ from werkzeug.wrappers import Request, Response from werkzeug.serving import run_simple class Foo(object): def __call__(self, *args, **kwargs): return Response(\'Hello World!\') if __name__ == \'__main__\': # 当请求打来之后,自动执行:hello() obj = Foo() run_simple(\'localhost\', 4000, obj)
安装flask
pip3 install flask
基本使用
""" pip install flask pip3 install flask """ from flask import Flask # 1. 实例化Flask对象 app = Flask(\'xxxx\') """ 1. 执行 app.route(\'/index\')并获取返回值 xx 2. @xx def index(): return \'Hello World\' 3. 执行 index = xx(index) 本质: { \'/index\': index } """ @app.route(\'/index\') def index(): return \'Hello World\' if __name__ == \'__main__\': app.run()
1 装饰器的使用,template模板的定义 template_folder=\'templates’ static_folder=\'static\' 默认路径也是这个 模板文件和静态文件
2 methods=["GET","POST"]
3 默认session的使用是在浏览器的加密的cookie中存放secret_key=\'****asdasds**\' 写一端字符串
import functools from flask import Flask,render_template,request,redirect,session app = Flask(\'xxxx\',template_folder="templates") app.secret_key = \'as923lrjks9d8fwlkxlduf\' def auth(func): @functools.wraps(func) def inner(*args,**kwargs): user_info = session.get(\'user_info\') if not user_info: return redirect(\'/login\') return func(*args,**kwargs) return inner """ { /order: inner函数, name: order /index: inner函数, name: index } """ @app.route(\'/order\',methods=[\'GET\']) @auth def order(): user_info = session.get(\'user_info\') if not user_info: return redirect(\'/login\') return render_template(\'index.html\') @app.route(\'/index\',methods=[\'GET\']) @auth def index(): return render_template(\'index.html\') @app.route(\'/login\',methods=[\'GET\',\'POST\']) def login(): if request.method == "GET": return render_template(\'login.html\') else: user = request.form.get(\'user\') pwd = request.form.get(\'pwd\') if user == \'alex\' and pwd == \'123\': session[\'user_info\'] = user return redirect(\'/index\') # return render_template(\'login.html\',msg = "用户名或密码错误",x = 123) return render_template(\'login.html\',**{\'msg\':\'用户名或密码错误\'}) @app.route(\'/logout\',methods=[\'GET\']) def logout(): del session[\'user_info\'] return redirect(\'/login\') if __name__ == \'__main__\': app.run()
flask 准备阶段
app = Flask(__name__)
实例化Flask 对象
@app.route(\'/index\')
把路由规则保存到Map类中
run() 方法执行,socket的服务端开始运行,等待用户连接
flask 运行阶段
flask的运行的入口是__call__方法
接着开始执行视图函数
配置
s1.py app.config.from_object(\'settings.TestingConfig\') settings.py class BaseConfig(object): DEBUG = False SESSION_REFRESH_EACH_REQUEST = True class ProConfig(BaseConfig): pass class DevConfig(BaseConfig): DEBUG = True class TestingConfig(BaseConfig):
路由系统
- 添加路由的本质 @app.route(\'/index\') def index(): return "index" def order(): return \'Order\' app.add_url_rule(\'/order\', None, order) FBV: @app.route(\'/index\') def index(): if return "index" def order(): return \'Order\' app.add_url_rule(\'/order\', None, order) CBV: class X1View(views.MethodView): methods = [\'GET\',\'POST\'] decorators = [auth, ] def get(self): return \'x1.GET\' def post(self): return \'x1.POST\' app.add_url_rule(\'/x1\', view_func=X1View.as_view(name=\'x1\')) # name=endpoint
源码码流程 a. 生成路由关系 [ Rule(‘index’,函数), Rule(‘index’,函数), Rule(‘index’,函数), Rule(‘index’,函数), ] b. 用户请求来了 - 获取用户U请求 并进行匹配 - 将ctx(封装了请求相关所有数据的对象)放置到 “特殊的位置” c. 执行视图函数 d. 将函数返回值响应给用户 e. 将 ctx 在“特殊的位置”移除。
模板文件
1 import functools 2 from flask import Flask,render_template,request,redirect,session,Markup 3 4 app = Flask(\'xxxx\',template_folder="templates") 5 app.secret_key = \'as923lrjks9d8fwlkxlduf\' 6 7 @app.template_global() 8 def sb(a1,a2): 9 return a1+a2 10 @app.template_filter() 11 def db(a1,a2,a3): 12 return a1+a2+a3 13 def fffff(value): 14 return Markup("<input type=\'text\' value=%s>"%(value)) 15 16 @app.route(\'/index\',methods=[\'GET\']) 17 def index(): 18 context = { 19 \'k1\': \'v1\', 20 \'k2\': [11, 22, 33], 21 \'k3\': { 22 \'name\': \'oldboy\', 23 \'age\': 56 24 }, 25 \'k4\': fffff 26 } 27 return render_template(\'index.html\',**context) 28 29 30 if __name__ == \'__main__\': 31 app.run()
{%extends \'layout.html\'%} {%block content%} <h2>index</h2> <div> {%include \'sakula.html\'%} </div> <div> {{k4(\'hebe\')}} </div> <div> {{k1}} </div> <div>{{k2}}</div> <div> {% for k,v in k3.items()%} {{k}}--{{v}} {%endfor%} </div> <div> {{k3.name}} {{k3[\'name\']}} {{k3.get(\'name\')}} </div> <div> 全局函数:{{sb(1,2)}} 全局函数2:{{1|db(2,3)}} </div> {%endblock%}
以上是关于flask学习笔记1的主要内容,如果未能解决你的问题,请参考以下文章