码迷,mamicode.com
首页 > 其他好文 > 详细

flask学习笔记1

时间:2018-04-22 19:58:59      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:import   包含数据库   views   bsp   笔记   filter   login   技术   sock   

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

标签:import   包含数据库   views   bsp   笔记   filter   login   技术   sock   

原文地址:https://www.cnblogs.com/hexintong/p/8907312.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!