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

  

  

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

时间: 2024-10-01 07:46:42

flask学习笔记1的相关文章

Flask学习笔记——配置管理

1.硬编码: app = Flask(__name__) # app.config 是flask.config.Config类的实例,继承自内置数据结构dict app.config['DEBUG'] = True 2.参考--flask.config.Config类: class Config(dict): """Works exactly like a dict but provides ways to fill it from files or special dict

flask学习笔记(-操作数据库)

Python 数据库框架 大多数的数据库引擎都有对应的 Python 包,包括开源包和商业包.Flask 并不限制你使用何种类型的数据库包,因此可以根据自己的喜好选择使用 MySQL.Postgres.SQLite.Redis.MongoDB 或者 CouchDB. 如果这些都无法满足需求,还有一些数据库抽象层代码包供选择,例如SQLAlchemy和MongoEngine.你可以使用这些抽象包直接处理高等级的 python 对象,而不用处理如表.文档或查询语言此类的数据库实体. 选择数据库框架的

Flask学习笔记-No module named flask.ext.wtf

1 from flask.ext.wtf import Form 2 from wtforms import StringField,BooleanField 3 from wtforms.validators import DataRequired 4 5 class LoginForm(Form): 6 openid = StringField('openid',validators=[DataRequired()]) 7 remember_me = BooleanField('rememb

flask学习笔记(-数据库)

Python 数据库框架 大多数的数据库引擎都有对应的 Python 包,包括开源包和商业包.Flask 并不限制你使用何种类型的数据库包,因此可以根据自己的喜好选择使用 MySQL.Postgres.SQLite.Redis.MongoDB 或者 CouchDB. 如果这些都无法满足需求,还有一些数据库抽象层代码包供选择,例如SQLAlchemy和MongoEngine.你可以使用这些抽象包直接处理高等级的 Python 对象,而不用处理如表.文档或查询语言此类的数据库实体. 选择数据库框架的

flask学习笔记之--表单控件

表单验证 Flask-WTF 从 version 0.9.0有了变化,正确要引用wtforms包 正确的写法: from flask.ext.wtf import Form from wtforms import TextField, BooleanField from wtforms.validators import Required

Flask学习笔记(3)-数据库迁移

数据库迁移 通过创建虚拟flask环境来迁移数据库. 一.创建虚拟环境 virtualenvwrapper库中有个mkvirtualenv函数,用来创建虚拟环境(make virtual envirement).使用命令 mkvirtualenv flask-tutorial --python=python3.6 创建一个名为flask-tutorial的虚拟环境,如图可利用workon flask-tutorial命令激活这个虚拟环境.使用deactivate退出这个虚拟环境.在默认条件下,虚

flask学习笔记(1)-虚拟环境安装

Mac(类Linux): pip install virtualenv mkdir testvirtualenv cd testvirtualenv virtualenv flask-env#创建虚拟环境 source bin/activate#激活虚拟环境 deactivate#退出虚拟环境 windows: virtualenv flask-env cd Scripts activate 决定入Flask这个坑竟然是为了给公司的问卷分析产品做一个前端,这样能通过Python对数据库做一些操作

Flask学习笔记

1.路由用"/"结尾. 比如@app.route("/about/"),可以匹配/about和/about/,而@app.route("/about")不能匹配/about/ 2.url_for:就是一个根据函数名,找到对应路由,返回一个url字符串的函数而已. 3.静态地址默认为static,可以访问静态文件,如http://127.0.0.1/static/logo.png

Flask 学习笔记-第十五章-应用编程接口

(Rich Internet Application,RIA)的架构. 在RIA中,服务器的主要功能(有时是唯一功能)是为客户端提供数据存取服务. 在这种模式中,服务器变成了Web服务或应用编程接口(Application Programming Interface,API). 表现层状态转移(Representational State Transfer,REST)架构崭 露头角,成为Web程序的新宠,因为这种架构建立在大家熟识的万维网 基础之上. Web服务的REST架构方式,并列出了6个符