vibora 经验

pip  install  vibora  tortoise-orm
from  tortoise  import  fields,  models
from  tortoise.contrib.pydantic  import  pydantic_model_creator

class  User(models.Model):
      id  =  fields.IntField(pk=True)
      username  =  fields.CharField(max_length=255,  unique=True)
      email  =  fields.CharField(max_length=255,  unique=True)

#  创建  Pydantic  model,方便在请求处理中使用
UserPydantic  =  pydantic_model_creator(User,  name='User')
from  tortoise  import  Tortoise

async  def  init_db():
      #  这里配置数据库连接
      TORTOISE_ORM  =  {
          'connections':  {
              'default':  {
                  'engine':  'asyncpg',
                  'host':  '127.0.0.1',
                  'port':  '5432',
                  'user':  'user',
                  'password':  'password',
                  'database':  'test_db',
              },
          },
          'apps':  {
              'models':  {
                  'models':  ['models'],    #  注册我们的models模块
                  'default_connection':  'default',
              },
          },
      }
     
      await  Tortoise.init(TORTOISE_ORM)
      await  Tortoise.generate_schemas()
from  vibora  import  Vibora,  Request
from  pydantic  import  BaseModel
from  tortoise.exceptions  import  DoesNotExist
from  models  import  User,  UserPydantic
from  db_config  import  init_db

app  =  Vibora()

@app.listener('before_server_start')
async  def  setup_db(app,  loop):
      await  init_db()

#  创建一个请求模型来验证输入
class  CreateUser(BaseModel):
      username:  str
      email:  str

@app.route('/users',  methods=['POST'])
async  def  create_user(request:  Request,  user:  CreateUser):
      user  =  await  User.create(username=user.username,  email=user.email)
      return  {'id':  user.id,  'username':  user.username,  'email':  user.email}

@app.route('/users/{user_id}',  methods=['GET'])
async  def  get_user(request:  Request,  user_id:  int):
      try:
          user  =  await  User.get(id=user_id).prefetch_related('user')
          return  {'id':  user.id,  'username':  user.username,  'email':  user.email}
      except  DoesNotExist:
          return  {'error':  'User  not  found'},  404

@app.route('/users/{user_id}',  methods=['PUT'])
async  def  update_user(request:  Request,  user_id:  int,  user:  CreateUser):
      try:
          await  User.filter(id=user_id).update(username=user.username,  email=user.email)
          return  {'message':  'User  updated  successfully'}
      except  DoesNotExist:
          return  {'error':  'User  not  found'},  404

@app.route('/users/{user_id}',  methods=['DELETE'])
async  def  delete_user(request:  Request,  user_id:  int):
      try:
          await  User.get(id=user_id).delete()
          return  {'message':  'User  deleted  successfully'}
      except  DoesNotExist:
          return  {'error':  'User  not  found'},  404

if  __name__  ==  '__main__':
      app.run(debug=True)
from  vibora  import  Vibora
from  db_config  import  init_db
from  routes  import  setup_routes

app  =  Vibora()

@app.listener('before_server_start')
async  def  setup_db(app,  loop):
      await  init_db()

#  设置路由
setup_routes(app)

if  __name__  ==  '__main__':
      app.run(debug=True)
from  pydantic  import  BaseModel
from  tortoise.exceptions  import  DoesNotExist
from  models  import  User,  UserPydantic
from  vibora  import  Request,  route

class  CreateUser(BaseModel):
      username:  str
      email:  str

@route('/users',  methods=['POST'])
async  def  create_user(request:  Request,  user:  CreateUser):
      user  =  await  User.create(username=user.username,  email=user.email)
      return  {'id':  user.id,  'username':  user.username,  'email':  user.email}

@route('/users/{user_id}',  methods=['GET'])
async  def  get_user(request:  Request,  user_id:  int):
      try:
          user  =  await  User.get(id=user_id).prefetch_related('user')
          return  {'id':  user.id,  'username':  user.username,  'email':  user.email}
      except  DoesNotExist:
          return  {'error':  'User  not  found'},  404

@route('/users/{user_id}',  methods=['PUT'])
async  def  update_user(request:  Request,  user_id:  int,  user:  CreateUser):
      try:
          await  User.filter(id=user_id).update(username=user.username,  email=user.email)
          return  {'message':  'User  updated  successfully'}
      except  DoesNotExist:
          return  {'error':  'User  not  found'},  404

@route('/users/{user_id}',  methods=['DELETE'])
async  def  delete_user(request:  Request,  user_id:  int):
      try:
          await  User.get(id=user_id).delete()
          return  {'message':  'User  deleted  successfully'}
      except  DoesNotExist:
          return  {'error':  'User  not  found'},  404

def  setup_routes(app):
      app.add_route(create_user)
      app.add_route(get_user)
      app.add_route(update_user)
      app.add_route(delete_user)
from  vibora  import  Vibora,  Request,  Response
from  vibora.responses  import  JSONResponse
from  db_config  import  init_db
from  routes  import  setup_routes
from  middleware  import  token_middleware
import  asyncio
import  datetime

app  =  Vibora()

@app.listener('before_server_start')
async  def  setup_db(app,  loop):
      await  init_db()

#  设置路由
setup_routes(app)

#  定时事务
async  def  schedule_transactions(app):
      while  True:
          #  第一个事务:每6秒处理一次
          await  asyncio.sleep(6)
          print("Running  the  first  transaction...")

          #  第二个事务:每33分钟处理一次
          await  asyncio.sleep(33  *  60)
          print("Running  the  second  transaction...")

          #  第三个事务:每天早上1点到5点之间处理
          now  =  datetime.datetime.now()
          if  now.hour  >=  1  and  now.hour  <  5:
              print("Running  the  third  transaction...")
              #  确保不会在1小时内多次执行
              await  asyncio.sleep((5  -  now.hour)  *  3600  -  now.minute  *  60)

#  跨域处理中间件
@app.middleware
async  def  cors_middleware(request:  Request,  handler):
      response  =  await  handler(request)
      response.headers['Access-Control-Allow-Origin']  =  '*'    #  允许所有来源
      response.headers['Access-Control-Allow-Methods']  =  'GET,  POST,  PUT,  DELETE,  OPTIONS'
      response.headers['Access-Control-Allow-Headers']  =  'Content-Type,  Authorization'
      return  response

#  使用中间件验证token
app.middleware(token_middleware)

#  启动定时事务
@app.listener('after_server_start')
async  def  start_scheduling(app,  loop):
      loop.create_task(schedule_transactions(app))

if  __name__  ==  '__main__':
      app.run(debug=True)
from  vibora  import  Request,  Response
from  typing  import  Awaitable
from  jose  import  jwt    #  假设使用的是PyJWT库

async  def  token_middleware(request:  Request,  handler:  Awaitable)  ->  Response:
      token  =  request.headers.get('Authorization',  '').replace('Bearer  ',  '')
      if  token:
          try:
              #  假设你的secret_key是在环境变量中
              user_info  =  jwt.decode(token,  'secret_key',  algorithms=['HS256'])
              #  将用户信息添加到请求中
              request.state.user_info  =  user_info
          except:
              return  JSONResponse({'error':  'Invalid  token'},  status_code=401)
      else:
          return  JSONResponse({'error':  'Token  is  missing'},  status_code=401)
      return  await  handler(request)

 










posted @ 2024-01-19 16:43  pearlcity  阅读(19)  评论(0编辑  收藏  举报