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()
模板的app

 

{%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%}
模板的html

 


  

 

  

posted @ 2018-04-22 17:55  hexintong  阅读(225)  评论(0编辑  收藏  举报