python 学习笔记(6)—— Flask 、MySql

目录

Flask

1、起步

2、渲染项目的首页

3、处理无参数的 GET 请求

4、处理有 query 参数的 GET 请求

6、处理 params 参数的 get 请求 

6、处理 application/json 类型请求体的 POST 请求

7、根据参数渲染模板页面

 8、上传文件

数据库操作(mysql)


Flask

1、起步

        先创建一个项目的文件夹,然后在该文件夹下初始化一个虚拟环境。虚拟环境建设好后,文件夹下将有一个 venv 的目录。

# python 3版本 创建虚拟环境:
py -3 -m venv venv

# 激活虚拟环境
venv\Scripts\activate

# 安装 flask
pip install flask

        依次创建 flaskr、flaskr/static、flaskr/templates、tests目录:

        flaskr目录:包含应用代码和文件的 Python 包;

                /static:存放静态文件,如图片等;

                /templates:可以用来存放 html 文件,用于服务端渲染;

        test 目录:用来存放测试类型的文件;

python 学习笔记(6)—— Flask 、MySql_第1张图片

2、渲染项目的首页

from flask import Flask
from flask import render_template
from flask_cors import CORS

# 创建该类的实例
app = Flask(__name__)
CORS(app, resources={r'/*': {'origins' :'*'}})      # 同源策略解决方法


# 使用装饰器设定匹配的URL,如果命中,则执行下面的函数;默认是 get 请求
@app.route('/')
def default_page():
    # 返回指定的页面,是项目下 templates 下的文件
    return render_template('index.html')

if __name__ == '__main__':
    # 运行该服务,监听的端口为 9090,host=‘0.0.0.0’表示接受公开访问
    app.run(port=9090, host='0.0.0.0')
# templates/index.js




    
    Title
    


    

Hello, welcome to the first page.

python 学习笔记(6)—— Flask 、MySql_第2张图片

python 学习笔记(6)—— Flask 、MySql_第3张图片

3、处理无参数的 GET 请求

         改造 index.html 文件,让请求和结果展示在当前界面完成:

# templates/index.js


    

Hello, welcome to the first page.

# 规定匹配的路径为 /get_time 或 /get_time?
@app.route('/get_datetime')
def get_datetime():
    return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

python 学习笔记(6)—— Flask 、MySql_第4张图片

4、处理有 query 参数的 GET 请求

        /templates/index.html 中新增的内容: 

        
  • from flask import Flask,request
    
    @app.route('/get_with_args')
    def get_with_args():
        args = request.args
    
        # 各参数可以从 request 实例上去获取
        # print(args['name'], args['gender'])
    
        name = args['name']
        gender = args['gender']
        return f'你好,帅气的{name}先生' if gender == 'man' else f'你好,美丽的{name}小姐'

            关于 request 更多内容可以参考: https://flask.net.cn/api.html#incoming-request-data

    python 学习笔记(6)—— Flask 、MySql_第5张图片

    6、处理 params 参数的 GET 请求 

             html 文件新增的测试内容:

            
  • # 两个 params 参数都必须传, 预定义 nickname 参数为字符串,age 为整型
    @app.route('/test-params//')
    def test_params(nickname, age):
        return {'nickname':nickname,'age':age}

    python 学习笔记(6)—— Flask 、MySql_第6张图片

    6、处理 application/json 类型请求体的 POST 请求

            index.html 文件中新增的内容: 

            
  • @app.route('/test-post', methods=['post'])
    def test_post():
        str = (request.data).decode()
        print(str)
        obj = json.loads(str)
        print(obj['username'])
    
        print(request.json['username'])
        
        # print(request.get_data())           # 与 request.data 一致,是字符串类型
        # print(request.json)                 # 是dict类型
        return 'ok'

    python 学习笔记(6)—— Flask 、MySql_第7张图片

    python 学习笔记(6)—— Flask 、MySql_第8张图片

    7、根据参数渲染模板页面

            index.js 中添加的内容: 

            
  •         新创建两个 html: 

    # new-page.html   当有 name 时返回的页面,可以没有address
    
    
           {% if address %}
               

    Hi {{name}}, we know your address is {{address}}.

    {% else %}

    Hello {{name}}!

    {% endif %}
    # 404.html
    
    
        
        
        404
        
    
    
        
    4
    0
    4
    no found
    # 可以直接访问
    @app.route('/new-page')
    def new_page():
        # 设置 address 和 name 都不是必传参数
        address = request.args['address'] if request.args else ''
        name = request.args['name'] if request.args else ''
        if name:                    # 往模板页面传递两个参数
            return render_template('another.html', address=address, name=name)
        else:
            # 如果没有名字,则返回 404 的页面
            return render_template('404.html')

    python 学习笔记(6)—— Flask 、MySql_第9张图片 只有 name 时

    python 学习笔记(6)—— Flask 、MySql_第10张图片 name 和 address 都没有时

    python 学习笔记(6)—— Flask 、MySql_第11张图片 name 和 address 都具备时

    python 学习笔记(6)—— Flask 、MySql_第12张图片

     8、上传文件

            index.html 中新增的内容: 

            
  • @app.route('/upload-file', methods=['post'])
    def upload_file():
        if 'file' not in request.files:
            return 'upload fail'
    
        file = request.files['file']
    
        if file.filename == '':
            return 'filename no found'
    
        file.save(f'./{file.filename}')        # 保存图片到本地
    
        return 'ok'

    关于 flask 文件上传的更安全的处理:上传文件_Flask中文网

    数据库操作(mysql)

            安装 pymysql:

    pip install pymysql
    import pymysql
    
    # 连接指定数据库
    conn = pymysql.connect(host='localhost', user='root',
                           password='abcdef',database='python_study',
                           charset='utf8')
    
    # 定义一个游标对象,靠游标对象来执行sql 以及获取 结果
    #cursor = conn.cursor()          # 默认是元组形式的结果
    
    # 将游标对象定义为 字典 类型,进而更方便地获取数据
    from pymysql.cursors import DictCursor
    cursor = conn.cursor(DictCursor)            # 创建游标,定义返回的数据类型是字典

            查询语句的执行和结果获取:

    # 创建并执行 执行sql语句
    sql = 'select * from student'
    cursor.execute(sql)
    
    # 获取执行的结果集 所有数据
    res = cursor.fetchall()
    print(res)
    
    # res = cursor.fetchmany(3)                   # 获取前三条结果

    python 学习笔记(6)—— Flask 、MySql_第13张图片

            关于更新类的操作(增、删、改):

    # 更新一条数据
    sql = "update student set age = 9 where num = '1000'"
    cursor.execute(sql)
    conn.commit()                       # 显式提交更新操作
    
    
    
    # 新增一条数据,注意格式化的sql语句,如果有引号的要加上引号
    name = '许九'
    age = 10
    gender = '男'
    num = '1006'
    sql = f"insert into student values ('{name}','{num}','{gender}',{age});"
    cursor.execute(sql)
    conn.commit()

            最后需要关闭连接:

    # 关闭连接
    conn.close()

            如果 连接的时候报错:RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods

            该错误指出需要 'cryptography' 包来处理 'sha256_password' 或 'caching_sha2_password' 的认证方式。

            这可能是因为 Python 环境中缺少了 'cryptography' 包。这个包是一个 Python 的加密库,它提供了许多加密算法的实现,包括 'sha256_password' 和 'caching_sha2_password' 这两种 MySQL 的密码加密方式。

            直接安装这个包然后再运行程序即可:

    pip install cryptography
    

            

     参考:

    [1] flask获取post请求参数_flask post参数_阿常呓语的博客-CSDN博客

    [2] 快速上手_Flask中文网 

    你可能感兴趣的:(Python,后端,python,mysql,flask,笔记,学习)