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

 


  

 

  

以上是关于flask学习笔记1的主要内容,如果未能解决你的问题,请参考以下文章

flask学习笔记(-Web 表单)

千锋Flask学习笔记

千锋Flask学习笔记

千锋Flask学习笔记

flask学习笔记(-数据库)

flask学习笔记(-数据库)