Flask开发:初识Flask

1. HTTP通信与Web框架

在这里插入图片描述
补上:借助刚才建立好的tcp连接将响应回传

1.1 流程

客户端将请求打包成HTTP的请求报文(HTTP协议格式的请求数据)
采用TCP传输发送给服务器端
服务器接收到请求报文后按照HTTP协议进行解析
服务器根据解析后获知的客户端请求进行逻辑执行
服务器将执行后的结果封装成HTTP的响应报文(HTTP协议格式的响应数据)
采用刚才的TCP连接将响应报文发送给客户端
客户端按照HTTP协议解析响应报文获取结果数据

1.2 细节

客户端不一定是浏览器,也可以是PC软件、手机APP、程序
根据服务器端的工作,将其分为两部分:
服务器:与客户端进行tcp通信,接收、解析、打包、发送http格式数据
业务程序:根据解析后的请求数据执行逻辑处理,形成要返回的数据交给服务器
服务器与Python业务程序的配合使用WSGI协议

1.3 web框架

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

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

1.4 框架分类

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

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

1.5 明确web开发任务

视图开发:根据客户端请求实现业务逻辑(视图)编写
模板、数据库等其他的都是为了帮助视图开发,不是必备的

2. 认识Flask

2.1 简介

Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。

Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug(路由模块) ,模板引擎则使用 Jinja2 。

可以说Flask框架的核心就是Werkzeug和Jinja2。

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

2.2 与Django对比

django提供了:
django-admin快速创建项目工程目录
manage.py 管理项目工程
orm模型(数据库抽象层)
admin后台管理站点
缓存机制
文件存储系统
用户认证系统

而这些,flask都没有,都需要扩展包来提供

2.3 Flask扩展包

Flask-SQLalchemy:操作数据库;
Flask-migrate:管理迁移数据库;
Flask-Mail:邮件;
Flask-WTF:表单;
Flask-script:插入脚本;
Flask-Login:认证用户状态;
Flask-RESTful:开发REST API的工具;
Flask-Bootstrap:集成前端Twitter Bootstrap框架;
Flask-Moment:本地化日期和时间;

Flask中文文档:https://dormousehole.readthedocs.io/en/latest/

3. 创建虚拟环境

3.1 anaconda3

在这里插入图片描述
官网:https://www.anaconda.com/distribution/

3.2 使用anaconda3创建虚拟环境

anaconda3的具体使用可参考:https://blog.csdn.net/sunxinyu/article/details/78801534

使用conda创建名为flask_py的虚拟环境:
conda create --name flask_py python=3.7

进入到flask_py虚拟环境中安装flask:

pip install Flask==1.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

一次性导出虚拟环境中所有依赖包:

pip freeze > 任意路径下的文件名.txt   

一次性安装刚才虚拟环境中所导出的依赖包:

pip install -r 任意路径下的文件名.txt

4. Flask1.1的初步使用

4.1 hello world

打开pycharm,创建一个新的pure项目,按照下面的要求配置好环境:
在这里插入图片描述
在项目下创建一个app.py文件,并写入下面代码:

from flask import Flask

app = Flask(__name__) # 读取当前文件的位置

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

运行app.py文件,控制台输出如下信息,说明flask环境成功搭建:
在这里插入图片描述
在app.py中加上我们的视图函数:

# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
    return 'Hello World'

再次运行,刷新页面:
在这里插入图片描述

4.2 Response三剑客

HTTPresponse: 返回字符串

def index();
    renturn '愿所用中国青年向上走,有一份热,发一份光'

render: 返回HTML文件
在项目根目录下建一个templates文件夹,并在其中新建个test.html:
在这里插入图片描述
告诉pycharm,存放模板文件的路径,否则会飘黄,右击templates文件夹,设置如下:
在这里插入图片描述
在这里插入图片描述
templates文件夹变为紫色,说明设置完成。
打开app.py,插入代码如下:

from flask import render_template

@app.route('/test')
def index():
    return render_template('test.html')

redirect: 302重定向

from flask import redirect
@app.route("/")
def test():
    return redirect('/test')

@app.route("/test")
def index(): Content-Type: application/json
    return render_template("test.html")

jsonify: Content-Type: application/json

from flask import jsonify
@app.route("/")
def test():
    return jsonify({'winston':'xxxx','age':20})

send_file: 发送图片或流媒体

from flask import send_file
@app.route("/")
def test():
    return send_file("1.mp4")

4.3 run参数说明

Ctrl+鼠标点击 app.run():

    def run(self, host=None, port=None, debug=None, load_dotenv=True, **options):
    host:监听的ip
    port:启动的端口
    debug:true 打开调试模式 Flase 关闭调试模式
    load_dotenv:加载最近的.env和.flaskenv 文件以设置环境变量

具体可见flask官方文档run:https://dormousehole.readthedocs.io/en/latest/api.html#flask.Flask.run

4.4 request

改写test.html:

<form action="" method="post" enctype="multipart/form-data">
    <p><input type="text" name="username"></p>
    <p><input type="password" name="pwd"></p>
    <p><input type="file" name="kkk"></p>
    <p><input type="submit" value="提交"></p>
</form>

request中的常用方法:

from flask import request

@app.route("/",methods=('get','post'))
def test():
    print(request.values) # 拿到url和form中的所用数据,但key相同时会覆盖,通常不用
    print(request.method) # 请求方式
    if request.method == 'GET':
        print(request.args.to_dict()) # 存储的是所有FormData中的所有数据
        print(request.data) # 当Content-Type无法被解析时,存放原始数据
        print(request.url) # 请求地址
        print(request.headers) # 请求头内容
        print(request.path) # url路由地址
        print(request.host) # 主机地址
        print(request.host_url) # 将主机地址转换为httpurl
    if request.method == 'POST':
        picture=request.files.get('kkk') # 获取form表单中上传的文件 
        # 记得前端要加上enctype="multipart/form-data"
        picture.save(picture.filename) # 保存文件到本地
        print(request.form.to_dict())  # 存储的是所有URL中的所有数据
        print(request.json)  # Content-Type: application/json 存放在request.json中
    return render_template('test.html')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章