python之falsk框架s

一起进步吧!感谢大家的支持和关注


简单搭建服务端

  • 前言
    • 1.falsk框架
    • 2.虚拟环境
    • 3.安装包
    • 4.前后端交互
    • 5.数据库
    • 6. 两种不同的服务
      • 6.1不耗时
      • 6.2 耗时
  • 总结

前言

flask框架搭建简单服务端

1.falsk框架

web开发框架,为调用者提供api,可开发小程序

2.虚拟环境

隔离版本

3.安装包

pip install flask

4.前后端交互

  • 后端提供接口接收和返回数据给前端
  • 1.前端提交表单给后端接口
  • 2.前端发送ajax请求,向后端接口拿数据
  • 3.前端可以用postman工具

version1

from flask import Flask

app01 = Flask(__name__)


# http://127.0.0.1:5001/login/
@app01.route("/login/")
def login():
    return "login"


# http://127.0.0.1:5001/register/
@app01.route("/register/")
def register():
    return "register"


# http://127.0.0.1:5001/home/
@app01.route("/home/")
def home():
    return "home"


if __name__ == '__main__':
    app01.run(host="127.0.0.1", port=5001, debug=True)
    

浏览器直接网址输入测试


version2

from flask import Flask, request

app01 = Flask(__name__)


# http://127.0.0.1:5001/login/   get
# http://127.0.0.1:5001/login/?username=小新&password=fffggg  get
@app01.route("/login/", )
def login():
    # 请求头中拿数据
    username = request.args.get("username")
    password = request.args.get("password")
    print(username, password)
    return "login"


# http://127.0.0.1:5001/register/ post
@app01.route("/register/", methods=["post", "get"])
def register():
    # 请求体中拿数据
    username = request.form.get("username")
    password = request.form.get("password")
    print(username, password)

    return "register"


# http://127.0.0.1:5001/home/
@app01.route("/home/")
def home():
    return "home"


if __name__ == '__main__':
    app01.run(host="127.0.0.1", port=5001, debug=True)

    # 使用postman 测试
    # 自己写一个html页面用ajax发请求,或者表单提交数据


提交表单数据测试

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <form action="http://127.0.0.1:5001/register">
        <input type="text" name="username">
        <input type="text" name="password">
        <button type="submit">提交数据到后台</button>
    </form>
</div>

</body>
</html>


version3

# http://127.0.0.1:5001/home/
@app01.route("/home/")
def home():
    # 请求体中拿数据
    username = request.form.get("username")
    password = request.form.get("password")
    print(username, password)

    # 返回值字符串,想返回其他数据类型先包裹成字符串
    import uuid
    _sign = str(uuid.uuid4())

    return jsonify({"status": "成功", "code": _sign})

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <form action="http://127.0.0.1:5001/home/">
        <input type="text" name="username">
        <input type="text" name="password">
        <button type="submit">提交数据到后台</button>
    </form>
</div>

</body>
</html>

version4
基于文件授权,有凭证的用户才可以访问到数据

# 1.生成权限凭证,给顾客
# 2.检验用户凭证是否携带
# 3.检验用户凭证是否在文件中permission.txt
# 4.针对不同情况返回数据

权限脚本


for i in range(5):
    import uuid
    with open("permission.txt", "a", encoding="utf-8") as f:
        token = str(uuid.uuid4())
        name = f"xx{i}"
        row = f"{token},{name}\n"
        f.write(row)

检验权限

# 取文件中的所有数据
def get_token():
    user_dict = {}
    with open("permission.txt", "r", encoding="utf-8") as f:
        for line in f:
            print(line.strip().split(","))
            _token, name = line.strip().split(",")
            user_dict[name] = _token

    return user_dict


# http://127.0.0.1:5001/home/
@app01.route("/home/")
def home():
    # 请求头中拿数据
    username = request.args.get("username")
    password = request.args.get("password")
    token = request.args.get("token")
    print(username, password,token)

    # 获取文件数据进行校验
    if not token and username:
        return jsonify({"status":"403","error":"没有携带token"})
    token_list = get_token()
    if token not in token_list.values():
        return jsonify({"status":"403","error":"携带的token不确"})
    print("成功")
    return jsonify({"status": "200", "success": "成功"})



5.数据库

import pymysql
# 先在终端打开数据库客户端,创建数据库 userdb
# mysql -u root -p
# create database userdb;
# show database
# 安装pymysq
# 连接MySQL,自动执行 use userdb; -- 进入数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', charset="utf8", db='userdb')
cursor = conn.cursor()


# 1.新增(需commit)
"""
cursor.execute("insert into tb1(name,password) values('root','123123')")
conn.commit()
"""

# 2.删除(需commit)
"""
cursor.execute("delete from tb1 where id=1")
conn.commit()
"""

# 3.修改(需commit)
"""
cursor.execute("update tb1 set name='xx' where id=1")
conn.commit()
"""

# 4.查询
"""
cursor.execute("select * from tb where id>10")
data = cursor.fetchone() # cursor.fetchall()
print(data)
"""

# 关闭连接
cursor.close()
conn.close()
@app01.route("/test_mysql")
def  test_db_mysql():
    # 连接MySQL,自动执行 use userdb; -- 进入数据库
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', charset="utf8", db='xxdb')
    cursor = conn.cursor()
    print("成功连接数据库")
    cursor.close()
    conn.close()
    return "成功连接数据库"


连接池

import pymysql
from flask import Flask
from dbutils.pooled_db import PooledDB

app = Flask(__name__)

POOL = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=10,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,

    host='127.0.0.1', port=3306, user='root', passwd='123', charset="utf8", db='xxdb'
)


@app.route("/test/")
def test_db_pool():
    conn = POOL.connection()
    cursor = conn.cursor()
    print("连接连接池成功")
    cursor.close()
    conn.close()
    return "连接成功"


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=5000)


6. 两种不同的服务

6.1不耗时

在这里插入图片描述

6.2 耗时

在这里插入图片描述
这里引入redis数据库做队列操作

import hashlib
import uuid
import json
import pymysql
from flask import Flask, request, jsonify
from dbutils.pooled_db import PooledDB
import redis

app = Flask(__name__)

REDIS_POOL = redis.ConnectionPool(host='127.0.0.1', port=6379, password='1234', encoding='utf-8', max_connections=100)
TASK_QUEUE = "spider_task_list"
RESULT_QUEUE = "spider_result_dict"


# 放入任务
@app.route("/task", methods=["POST"])
def task():
    """
    请求的数据格式要求:{ "ordered_string":"....." }
    :return:
    """
    ordered_string = request.json.get("ordered_string")
    if not ordered_string:
        return jsonify({"status": False, 'error': "参数错误"})

    # 生成任务ID
    tid = str(uuid.uuid4())
    # 1.放入到redis队列中

    task_dict = {'tid': tid, 'data': ordered_string}

    conn = redis.Redis(connection_pool=REDIS_POOL)
    conn.lpush(TASK_QUEUE, json.dumps(task_dict))

    # 2.给用户返回
    return jsonify({"status": True, 'data': tid, 'message': "正在处理中,预计3分钟完成"})


# 取任务结果
@app.route("/result", methods=["GET"])
def result():
    # /result?tid=......
    tid = request.args.get("tid")
    if not tid:
        return jsonify({"status": False, 'error': "参数错误"})

    conn = redis.Redis(connection_pool=REDIS_POOL)
    sign = conn.hget(RESULT_QUEUE, tid)
    if not sign:
        return jsonify({"status": True, 'data': "", "message": "未完成,请继续等待"})

    sign_string = sign.decode('utf-8')
    conn.hdel(RESULT_QUEUE, tid)

    return jsonify({"status": True, 'data': sign_string})


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=5000)

worker

"""
去队列中获取任务,执行并写入到结果队列。
"""
import redis
import json
import hashlib

REDIS_POOL = redis.ConnectionPool(host='127.0.0.1', port=6379, password='1234', encoding='utf-8', max_connections=100)
TASK_QUEUE = "spider_task_list"
RESULT_QUEUE = "spider_result_dict"


def get_task():
    conn = redis.Redis(connection_pool=REDIS_POOL)
    data = conn.brpop(TASK_QUEUE, timeout=10)
    if not data:
        return
    return json.loads(data[1].decode('utf-8'))


def set_result(tid, value):
    conn = redis.Redis(connection_pool=REDIS_POOL)
    conn.hset(RESULT_QUEUE, tid, value)


def run():
    while True:
        # 1.获取任务
        task_dict = get_task()
        print(task_dict)
        if not task_dict:
            continue

        # 2.执行耗时操作
        # {"tid":'xxx','data':"....."}
        ordered_string = task_dict['data']
        encrypt_string = ordered_string + "560c52ccd288fed045859ed18bffd973"
        obj = hashlib.md5(encrypt_string.encode('utf-8'))
        sign = obj.hexdigest()

        # 3.写入结果队列(redis的hash)
        tid = task_dict['tid']
        set_result(tid, sign)


if __name__ == '__main__':
    run()

测试两个接口的数据
在这里插入图片描述
在这里插入图片描述


总结

看到这里,相信你会有所收获,本篇文章主要是借用flask框架搭建服务端。用到了数据库的连接池,细心的你肯定发现还用生产者消费模型,还有flask 获取请求头参数,请求体参数,使用postman测试数据,前后端交互前端提交数据只有两种:表单和发ajax请求。最后再次感谢大家的关注和支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值