Flask快速入门,知识整理

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Flask快速入门,知识整理

点击上方”python宝典”,关注获取python全套视频,

技术文章第一时间送达!

一、Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来)

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

“微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。

默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。

工具善其事,必先利其器。学习Flask所使用的软件环境如下:

python 3.6
Flask 0.12
Python的IDE我使用的是PyCharm。
pip3 install flask

第一步:使用PyCharm建立Flask工程

Flask快速入门,知识整理 Flask快速入门,知识整理

第二步:执行FlaskStudy.py

控制面板输出如下:


C:05SoftPython36python.exe C:/03Study/Python/FlaskStudy/FlaskStudy.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

第三步:浏览器中输入:

Flask快速入门,知识整理

使用Flask,我们已经建立了一个最最简单的web程序。

第四步:简单说明app程序


from flask import Flask

print(__name__)
app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

1.首先,我们导入了 Flask 类。这个类的实例将会是我们的 WSGI 应用程序。
2.接下来,我们创建一个该类的实例,第一个参数是应用模块或者包的名称。 如果你使用单一的模块(如本例),你应该使用 
name因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同( 也即是 ‘main‘ 或实际的导入名)。这是必须的,这样 Flask 才知道到哪去找模板、静态文件等等。

3.然后,我们使用 route() 装饰器告诉 Flask 什么样的URL 能触发我们的函数。
4.这个函数的名字也在生成 URL 时被特定的函数采用,这个函数返回我们想要显示在用户浏览器中的信息。
5.最后我们用 run() 函数来让应用运行在本地服务器上。 其中 if name__ == ‘main‘: 确保服务器只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。
第五步:更改配置

app.run(host=”127.0.0.1”, port=8090, debug=True)

可以修改端口号,执行模式改为debug,调试模式。

debug=True在生成环境上不建议。app.debug = True完成同样的功能

与Django的简单比较


Django:无socket,依赖第三方模块wsgi,中间件,路由系统(CBV,FBV),视图函数,ORM。cookie,session,Admin,Form,缓存,信号,序列化。。
Flask:无socket,中间件(需要扩展),路由系统,视图(CBV)、第三方模块(依赖jinja2),cookie,session弱爆了

二、基本使用


from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

1.实例化Flask对象时,可选的参数


app = Flask(__name__)    # 这是实例化一个Flask对象,最基本的写法
# 但是Flask中还有其他参数,以下是可填的参数,及其默认值

def __init__(self, import_name, static_path=None, static_url_path=None,
                 static_folder='static', template_folder='templates',
                 instance_path=None, instance_relative_config=False,
                 root_path=None):

template_folder:模板所在文件夹的名字

root_path:可以不用填,会自动找到,当前执行文件,所在目录地址

在return render_template时会将上面两个进行拼接,找到对应的模板地址

static_folder:静态文件所在文件的名字,默认是static,可以不用填

static_url_path:静态文件的地址前缀,写成什么,访问静态文件时,就要在前面加上这个


app = Flask(name,template_folder='templates',static_url_path='/xxxxxx')

如:在根目录下创建目录,templates和static,则return render_template时,可以找到里面的模板页面;如在static文件夹里存放11.png,在引用该图片时,静态文件地址为:/xxxxxx/11.png

  instance_path

 instance_relative_config是配合来用的。

这两个参数是用来找配置文件的,当用app.config.from_pyfile(‘settings.py’)这种方式导入配置文件的时候会用到

instance_relative_config:默认为False,当设置为True时,from_pyfile会从instance_path指定的地址下查找文件。

instsnce_path:指定from_pyfile查询文件的路径,不设置时,默认寻找和app.run()的执行文件同级目录下的instance文件夹;如果配置了instance_path(注意需要是绝对路径),就会从指定的地址下里面的文件

2.绑定路由关系的两种方式


#方式一
    @app.route('/index.html',methods=['GET','POST'],endpoint='index')
    def index():
        return 'Index'

#方式二

def index():
    return "Index"

self.add_url_rule(rule='/index.html', endpoint="index", view_func=index, methods=["GET","POST"])    #endpoint是别名
or
app.add_url_rule(rule='/index.html', endpoint="index", view_func=index, methods=["GET","POST"])
app.view_functions['index'] = index

添加路由关系的本质:将url和视图函数封装成一个Rule对象,添加到Flask的url_map字段中

3.Flask中装饰器应用


from flask import Flask,render_template,request,redirect,session
app = Flask(__name__)
app.secret_key = "sdsfdsgdfgdfgfh"   # 设置session时,必须要加盐,否则报错

def wrapper(func):
    def inner(*args,**kwargs):
        if not session.get("user_info"):
            return redirect("/login")
        ret = func(*args,**kwargs)
        return ret
    return inner

@app.route("/login",methods=["GET","POST"])  # 指定该路由可接收的请求方式,默认为GET
def login():
    if request.method=="GET":
        return render_template("login.html")
    else:
        # print(request.values)   #这个里面什么都有,相当于body
        username = request.form.get("username")
        password = request.form.get("password")
        if username=="haiyan" and password=="123":
            session["user_info"] = username
            # session.pop("user_info")  #删除session
            return redirect("/index")
        else:
            # return render_template("login.html",**{"msg":"用户名或密码错误"})
            return render_template("login.html",msg="用户名或者密码错误")

@app.route("/index",methods=["GET","POST"])
@wrapper    #自己定义装饰器时,必须放在路由的装饰器下面
def index():
    # if not session.get("user_info"):
    #     return redirect("/login")
    return render_template("index.html")


if __name__ == '__main__':
    app.run(debug=True) 

debug = True 是指进入调试模式,服务器会在 我们的代码修改后, 自动重新载入,有错误的话会提醒,每次修改代码后就不需要再手动重启

4.请求响应相关

1.获取请求数据,及相应


    - request
            - request.form   #POST请求的数据
            - request.args   #GET请求的数据,不是完全意义上的字典,通过.to_dict可以转换成字典
            - request.querystring  #GET请求,bytes形式的
        - response
            - return render_tempalte()    
            - return redirect()
            - return ""
            v = make_response(返回值)  #可以把返回的值包在了这个函数里面,然后再通过.set_cookie绑定cookie等
        - session
            - 存在浏览器上,并且是加密的
            - 依赖于:secret_key

2.flask中获取URL后面的参数


(from urllib.parse import urlencode,quote,unquote)

GET请求:

URL为:  http://127.0.0.1:5000/login?name=%27%E8%83%A1%E5%86%B2%27&nid=2


from urllib.parse import urlencode,quote,unquote

def login():
    if request.method == 'GET':
        s1 = request.args
        s2 = request.args.to_dict()
        s3 = urlencode(s1)
        s4 = urlencode(s2)
        s5 = unquote(s3)
        s6 = unquote(s4)
        s7 = quote("胡冲")
        print('s1',s1)
        print('s2',s2)
        print('s3',s3)
        print('s4',s4)
        print('s5',s5)
        print('s6',s6)
        print('s7',s7)

        return render_template('login.html')

#############结果如下####################

s1 ImmutableMultiDict([('name', "'胡冲'"), ('nid', '2')])
s2 {'name': "'胡冲'", 'nid': '2'}
s3 name=%27%E8%83%A1%E5%86%B2%27&nid=2
s4 name=%27%E8%83%A1%E5%86%B2%27&nid=2
s5 name='胡冲'&nid=2
s6 name='胡冲'&nid=2
s7 %E8%83%A1%E5%86%B2

原文链接:

https://www.cnblogs.com/huchong/p/8227606.html

Flask快速入门,知识整理

识别图中二维码,欢迎关注python宝典

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Flask快速入门,知识整理


 上一篇
Django中间件如何处理请求 Django中间件如何处理请求
点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! Django中间件在http请求 到达视图函数之前   和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法。 Dj
2021-04-05
下一篇 
Flask的配置与路由 Flask的配置与路由
点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 配置管理 flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为: { 'DEBUG':
2021-04-05