Flask教程(一)

一、Http流程:

二、框架概念

2.1Web框架:

                        能够被服务器调用起来,根据客户端的不同请求执行不同的逻辑处理形成要返回的数据的程序核心:

                        实现路由和视图(业务逻辑处理)

2.2框架的轻重:

                        重量级的框架:为方便业务程序的开发,提供了丰富的工具、组件,如Django

                        轻量级的框架:只提供Web框架的核心功能,自由、灵活、高度定制,如Flask、Tornado

2.3虚拟环境的搭建:

                        pip freeze > requirements.txt    (将虚拟环境安装的包导出到txt文件中)

                        pip install –r requirements.txt    (使用pip批量下载txt文件中的包)

三、了解Flask

3.1简介:Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。Flask本身相当于一个内核,其他几乎所有的功能都需要用第三方的扩展来实现。

Flask框架的核心就是Werkzeug(路由模块)和Jinja2(模块引擎)

3.2地位:Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。

3.3Flask的扩展包:

             Flask-SQLalchemy:操作数据库;

             Flask-migrate:管理迁移数据库;

             Flask-Mail:邮件;

             Flask-WTF:表单;

             Flask-script:插入脚本;

             Flask-Login:认证用户状态;

             Flask-RESTful:开发REST API的工具;

             Flask-Bootstrap:集成前端Twitter Bootstrap框架;

             Flask-Moment:本地化日期和时间;

四、第一个Flask程序

# 导入Flask类

from flask import Flask

#Flask类接收一个参数__name__

app = Flask(__name__)

# 装饰器的作用是将路由映射到视图函数index

@app.route('/')

def index():

    return 'Hello World'

# Flask应用程序实例的run方法启动WEB服务器

if __name__ == '__main__':

    app.run()

五、Flask的配置参数设置

5.1. 使用配置文件:

                app.config.from_pyfile("config.cfg")

5.2. 使用对象配置参数:

                class Config(object):

                            DEBUG = True

                            ITCAST = "python"

                app.config.from_object(Config)

5.3. 直接操作config的字典对象:

                app.config["DEBUG"] = True

总结:Flask中使用最多的配置方式是使用对象配置参数

六、Flask的路由配置

6.1限制路由的访问方式:

            @app.route('/sample',methods=['GET', 'POST'])

6.2使用url_for进行反解析

6.3动态路由:

            @app.route('/user/<int:id>')  #尖括号中冒号左边为参数的类型,右边为参数的名字

6.4转换器:

from flask import Flask

from werkzeug.routing import BaseConverter#从werkzeug工具包中导入识别正则表达式的包

class Regex_url(BaseConverter):                              #自定义转换器类,继承包

    def __init__(self, url_map, *args):

        super(Regex_url, self).__init__(url_map)       #继承父类的方法,初始化路由配置

        self.regex = args[0]                                       #将传入的正则表达式进行解析

app = Flask(__name__)

app.url_map.converters['re'] = Regex_url                #将写好的转换器类导入应用中

@app.route('/user/<re("[a-z]{3}"):id>')                    #使用转换器

def hello_itcast(id):

    return 'hello %s' %id

七、Flask的各种功能和组件

7.1获取请求参数(request):

from flask importrequest                    

            #request中包含了前端发送过来的所有请求数据

            # form和data是用来提取请求体数据

            # 通过requset.form可以直接提取请求体中的表单格式的数据, 是一个类字典的对象

            # 通过get方法只能拿到多个同名参数的第一个

示例:name = request.form.get("name")

7.2上传文件:

            @app.route("/upload", methods=["POST"])

            def upload():

            """接受前端传送过来的文件"""

file_obj = request.files.get("pic")

            # 直接使用上传的文件对象保存

file_obj.save("./demo1.png")

            return "上传成功"

7.3with语句的使用:

 with Foo() as foo:

#进入with语句的时候,with帮助我们调用对象的__enter__方法,

#离开with语句的时候,with帮助我们调用对象的__exit__方法

7.4abort函数的使用:

            from flask import  abort, Response

            # 使用abort函数可以立即终止视图函数的执行

            # 并可以返回给前端特定的信息

            # 传递状态码信息, 必须是标准的http状态码

abort(404)

7.5自定义错误处理函数:

            # 定义错误处理的方法

@app.errorhandler(404)

            def handle_404_error(err):

                    """自定义的处理错误方法"""

                    # 这个函数的返回值会是前端用户看到的最终结果

                    return u"出现了404错误, 错误信息:%s" % err

7.6设置响应信息:

            from flask import make_response

            # 使用make_response 来构造响应信息

            resp =make_response("index page 2")

resp.status = "999 itcast"  # 设置状态码

resp.headers["city"] = "sz"  # 设置响应头

            return resp

7.7返回json数据的方法:

from flask import Flask,jsonify

     return jsonify(city="sz", country="china")

7.8cookie的使用:

            # 设置cookie, 默认有效期是临时cookie,浏览器关闭就失效

            # max_age设置有效期,单位:秒

            resp.set_cookie("Itcast2", "Python1", max_age=3600)

            c = request.cookies.get("Itcast")

7.9session的使用:

7.9.1 flask的session需要用到的秘钥字符串:

                from flask import session

                app.config["SECRET_KEY"] = "dhsodfhisfhosdhf29fy989"

7.9.2session的机制:

7.10上下文的使用:

            请求上下文(request context)

            request和session都属于请求上下文对象。

            应用上下文(application context)

            current_app和g都属于应用上下文对象。

            current_app:表示当前运行程序文件的程序实例。

            g:处理请求时,用于临时存储的对象,每次请求都会重设这个变量。

7.11请求钩子:

                请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

                        before_first_request:在处理第一个请求前运行。

                        before_request:在每次请求前运行。

                        after_request(response):如果没有未处理的异常抛出,在每次请求后运行。

                        teardown_request(response):在每次请求后运行,即使有未处理的异常抛出。

              使用举例:    @app.before_first_request

7.12 Flask-Script扩展命令行:

        安装Flask-Script:pip install Flask-Script

        使用:

                from flask import Flask

                from flask_script import Manager

                app = Flask(__name__)

                manager = Manager(app)

                @app.route('/')

                def index():

                        return '床前明月光'

                if __name__ == "__main__":

                       manager.run()    ...

7.13 Jinja2模板:

7.13.1模板的使用示例:

            @app.route("/")

             def index():

                    returnrender_template("index.html", name="python")

7.13.2模板前端使用的过滤器:

            safe:禁用转义;

<p>{{ '<em>hello</em>' | safe }}</p>

            capitalize:把变量值的首字母转成大写,其余字母转小写;

<p>{{ 'hello' | capitalize }}</p>

            lower:把值转成小写;

<p>{{ 'HELLO' | lower }}</p>

            upper:把值转成大写;

 <p>{{ 'hello' | upper }}</p>

            title:把值中的每个单词的首字母都转成大写;

<p>{{ 'hello' | title }}</p>

            trim:把值的首尾空格去掉;

<p>{{ ' hello world ' | trim }}</p>

            reverse:字符串反转;

<p>{{ 'olleh' | reverse }}</p>

            format:格式化输出;

<p>{{ '%s is %d' | format('name',17) }}</p>

            striptags:渲染之前把值中所有的HTML标签都删掉;

<p>{{ '<em>hello</em>' | striptags }}</p>

            链式过滤器(使用两个过滤器):

<p>{{ “ hello world  “ | trim | upper }}</p>

            列表过滤器:

            first:取第一个元素

           <p>{{ [1,2,3,4,5,6] | first }}</p>

            last:取最后一个元素

           <p>{{ [1,2,3,4,5,6] | last }}</p>

            length:获取列表长度

           <p>{{ [1,2,3,4,5,6] | length }}</p>

            sum:列表求和

           <p>{{ [1,2,3,4,5,6] | sum }}</p>

            sort:列表排序

           <p>{{ [6,2,3,1,5,4] | sort }}</p>

            自定义过滤器:

            注意:自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。

            使用举例:

            @app.template_filter('db3')        #db3为模板中使用的装饰器名字

            def filter_double_sort(ls):

                    return ls[::-3]

    7.14 使用Flask-WTF实现表单:

    7.14.1视图函数使用示例:

 #导入wtf扩展的表单类

                    from flask_wtf import FlaskForm

                    #导入自定义表单需要的字段

                    from wtforms import SubmitField,StringField,PasswordField

                    #导入wtf扩展提供的表单验证器

                    from wtforms.validators import DataRequired,EqualTo

                    app = Flask(__name__)                #创建app

                    app.config['SECRET_KEY']='1'    #该模块需要设置 SECRET_KEY 的配置参数

                    # 定义表单的模型类

        classRegisterForm(FlaskForm):

        """自定义的注册表单模型类"""

            # 名字 验证器/验证器

            # DataRequired 保证数据必须填写,并且不能为空

            user_name = StringField(label=u"用户名",validators=[DataRequired(u"用户名不能为空")])

            password = PasswordField(label=u"密码",validators=[DataRequired(u"密码不能为空")])

            password2 = PasswordField(label=u"确认密码",validators=[DataRequired(u"确认密码不能为空"),

                                         EqualTo("password",u"两次密码不一致")])

            submit = SubmitField(label=u"提交")

                    @app.route("/register",methods=["GET","POST"])

        defregister():

            # 创建表单对象, 如果是post请求,前端发送了数据,flask会把数据在构造form对象的时候,存放到对象中

            form = RegisterForm()

            # 判断form中的数据是否合理

            # 如果form中的数据完全满足所有的验证器,则返回真,否则返回假

            ifform.validate_on_submit():

            # 表示验证合格

            # 提取数据

                uname = form.user_name.data

            returnrender_template("register.html",form=form)

    7.14.2模板html文件中使用示例:

                      <formmethod="post"> 

            {{ form.csrf_token }}       #先使用表单的csrf验证

            {{ form.user_name.label }}    #获取表单对象的label的值

            <p>{{form.user_name}}</p>    

            {% for msg in form.user_name.errors %}   #循环获取表单校验的错误信息

            <p>{{msg}}</p>

            {% endfor %}

         </form>

    7.15 宏:类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余。

    7.15.1宏的定义:                   

                        {% macroinput(name,value='',type='text',size=20) %}

                                <input type="{{ type }}"

                                           name="{{ name }}"

                                           value="{{ value }}"

                                           size="{{ size }}"/>

                        {% endmacro %}

    7.15.2宏的使用:

                        {{input(value='name',type='password',size=40)}}

    7.15.3导入其他模板的宏:

                        {% import 'macro.html' as func %}

                        {% func.input() %}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容