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%}