抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Python对接口的撰写

针对Python注册衔接Mysql的相关语言

一、在Pycharm中打开Mysql(连接)

1、基本语言
1
2
3
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@localhost:3308/star'

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
2、实例化SQLAlchemy
1
2
# 创建 SQLAlchemy 实例
db = SQLAlchemy(app)

SQLAlchemy需要引入

1
from flask_sqlalchemy import SQLAlchemy

从而实现实例化

二、自创表mysql表单

1、app.app_context( ) [ 上下文 ]
1
with app.app_context()

在运行程序时进行,优先于访问接口

2、查询相关表格存在与否
1
2
3
4
5
6
7
result = db.session.execute(text("SHOW TABLES LIKE 'todo'"))
print(result)
table_exists = result.fetchone() is None

if table_exists:
print("create")
db.create_all()

fetchone函数返回的是一个元组,如果元组为空,表示不存在相关表格,返回值为null


对于db.session:

1
db.session.excute(text("  "))

即在数据库中输入的语言 需要SQL语言

对于类似db的数据库语言,还有以下几种:

创建表格
1
db.create_all()
更新表格
1
db.session.commit
添加内容
1
2
db.session.add_all([])
db.session.add()

MySQL的初始化

1
2
import pymysql
pymysql.install_as_MySQLdb()

不适用初始化语言将面临报错!

Flask 分页

1.1 request.args.get( )

1
2
3
4
5
from flask import request

@app.router('/')
def demo()
something=request.args.get()

1.2 分页实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from flask import FLask
from flask_sqlalchemy import SQLAlchemy

app=Flask(__name__)
#实例化
@app.router('/',methods=["POST"])
async def page_example()
#从前端获取关键词page,若无数据默认为1,且其类型为int
page = request.args.get("page",1,type=int)
#同理,per_page也是同样的获取方式,其意义是每页的容量
per_page = request.args.get("per_page",10,type=int)
#过滤出未完成的任务(以flask备忘录为例子)
users = Todo.query.fliter_by(completed="False")

User = users.query.paginate(page,per_page=per_page)
for item in User.items
return jsonify( )

模糊匹配

SQLalchemy特别匹配:

模糊查找关键词

1
2
3
4
5
6
from SQLAlchemy import text

def search_demo( demo )
#假设已经创造了一个user的面向对象
#假设要匹配的是user的username
results = User.query.filter(text("username ILIKE:demo")).params(demo=f"%{demo}%").all()

Python sqlalchemy ORM

1.ORM的初始化

1.1 base基类的创建

1
2
3
from sqlalchemy.ext.declarative import declarative_base

base = declarative_base()

base的基类创建有利于sqlalchemy orm的功能实现,与SQLAlchemy()不相同,SQLAlchemy只能实现简单的数据库对接 而declarative可以实现数据表的映射

1.2 模型类编写(面向对象)

1
2
3
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import delclarative_base

导入需要的库,sqlalchemy.orm用于relationship的映射,ext.declarative用于基类创建的实例化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
base = declarative_base()

class like(base)
__tablename__ = "likes"
id = Column(Integer, primary_key=True)
video_id = Column(Integer, ForeignKey('videos.id'), nullable=False)
user_id = Column(Integer, ForeignKey('users.id'), nullable=False)

class Video(base)
__tablename__ = "videos"
id = Column(Integer, primary_key = True)
content = Column(String(length=2048))
#开始映射
liked_user = relationship("User", secondary = "likes", back_populates = "likes_video")

class User(base)
__tablename__ = "users"
id = Column(Integer, primary_key = True)
content = Column(String(2048))
#映射
likes_video = relationship("Video", secondary ="likes", back_populates = "liked_user")

双token(双令牌验证)

1、JWT验证(JSON Web Token)

1.1 basemodel基类创建(pydantic)

​ 在实现用户登录的双token中,常会采用pydantic里的basemodel模型,在fastapi中定义数据类型tokendata中,通过jwt令牌,将数据 填充到tokendata,包含用户名的信息(便于验证输入的数据)

1
2
3
4
from pydantic import BaseModel
class User (BaseModel)
id:int
username:str

至此已完成了对于user关于basemodel的定义 使用jwt方时,可以将其数据填充到user里

  • 这里的basemodel用于其他模型中,作为认证令牌
JWT验证搭建用户认证令牌是很好的处理

1.2 算法和密钥

1
2
3
4
#定义密钥
SECRET_KEY = "this-is-a-secret-key"
#算法
ALGORITHM = "HS256"

HS256:适用于对称加密,密钥用于加密和解密。适合于单个服务(如前后端分离应用)内部使用,不适合跨服务传递

1.3 OAuth2PasswordBearer( Flask.security库 )

1
from fastapi.security import OAuth2PasswordBearer

OAuth有一种使用OAuth2_scheme = OAuthPassworfBearer( tokenurl = “ /newtoken “ )

密码授权模式,便于增加用户访问的安全性

在 FastAPI 中,oauth2_scheme 是一个用于处理 OAuth2 密码模式的安全方案。它的主要作用是定义一个依赖项,用于在请求中获取访问令牌,并将该令牌传递给需要认证的路由处理函数。

虽然 Depends(oauth2_scheme) 返回的是访问令牌字符串,但在 get_current_user 函数中,你可以将这个字符串作为 JWT 字符串来解码,并获取其中的信息。这样,你就可以通过 JWT 字符串来验证用户的身份,并进行相应的操作。

1.4 JWT的正式使用

定义类和函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Tokendata(Basemodel):
username:str

async def get_current_user(token:str)
#这里的token作为下面用jwt解码的
try:
#试错
print("token start",token)
payload = jwt.decode(
token,
SECRET_KEY,
algorithms=[ALGORITHMS],
option={"verify_exp": True}#验证是否过期
)
#有try就要有except
except(jwt.PyJWTError,KeyError):
return None

jwt.decode 函数的 options 参数用于指定一些额外的选项,以控制 JWT 解码的行为。options 参数是一个字典,可以包含以下选项:

  1. verify_signature(默认为 True): 指定是否验证 JWT 的签名。如果为 False,则不会验证签名,这在调试或特殊情况下可能会用到。
  2. verify_exp(默认为 True): 指定是否验证 JWT 的过期时间(exp 声明)。如果为 True,则会验证过期时间,过期的 JWT 将被拒绝。
  3. verify_nbf(默认为 True): 指定是否验证 JWT 的生效时间(nbf 声明)。如果为 True,则会验证生效时间,尚未生效的 JWT 将被拒绝。
  4. verify_iat(默认为 False): 指定是否验证 JWT 的签发时间(iat 声明)。如果为 True,则会验证签发时间。
  5. verify_aud(默认为 False): 指定是否验证 JWT 的受众(aud 声明)。如果为 True,则会验证受众。
  6. require(默认为 None): 指定要求 JWT 包含的声明。可以指定一个字典,其中的键为声明名,值为要求的值。如果 JWT 不包含指定的声明或值不匹配,则会引发异常。
  7. leeway(默认为 0): 指定允许的时间偏差(以秒为单位),用于处理时间戳的差异或时钟偏移。如果需要考虑时钟不同步等情况,可以设置一个较大的值。
  8. algorithms(默认为 None): 指定允许的签名算法列表。如果指定了算法列表,则只会验证这些算法对应的签名。

评论