一起进步吧!感谢大家的支持和关注
简单搭建服务端
- 前言
- 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请求。最后再次感谢大家的关注和支持