商丘网站制作电话,如何做网站链接使用,网站权限设计方案,营销型网站建设的好处感觉为了实现maui的效果。准备了一个后端及restful项目 #xff0c;如同想吃鱼就健个鲁塘一下#xff0c;但还是写一下吧。
fastapi_amis_admin 是一个功能强大的框架#xff0c;旨在帮助开发者在使用 FastAPI 进行 web 开发时#xff0c;能够快速创建一个高效且易于管理的… 感觉为了实现maui的效果。准备了一个后端及restful项目 如同想吃鱼就健个鲁塘一下但还是写一下吧。
fastapi_amis_admin 是一个功能强大的框架旨在帮助开发者在使用 FastAPI 进行 web 开发时能够快速创建一个高效且易于管理的后台界面。通过结合 FastAPI 和 amis 的优势fastapi_amis_admin 提供了一种简洁而高效的方式来构建和管理 web 应用程序的后台。
主要特性 高性能基于 FastAPI保证了高并发和快速响应的能力。 高效率通过 amis 实现快速构建可视化界面减少开发时间。 易于使用基于标准的 Python 类型提示简化开发流程。 开源免费遵循 Apache2.0 协议鼓励社区参与和贡献。 具体用法
安装 首先确保你的 Python 版本是 3.6 或更高。然后使用 pip 进行安装
bash pip install fastapi_amis_admin 2. 创建 FastAPI 应用 如果你还没有一个 FastAPI 项目可以先创建一个
python from fastapi import FastAPI app FastAPI() 3. 定义你的数据模型 例如如果你有一个用户模型
python from pydantic import BaseModel class User(BaseModel): id: int name: str email: str 4. 使用 fastapi_amis_admin 快速生成管理后台 python from fastapi_amis_admin import AdminSite, ModelAdmin from your_models import User # 引入你刚定义的数据模型
admin_site AdminSite(app) # 创建一个 AdminSite 实例
注册你的数据模型到 AdminSite 中
admin_site.register(ModelAdmin(User)) 5. 启动你的 FastAPI 应用 使用 UVicorn 或其他你喜欢的 ASGI 服务器来运行你的应用。例如使用 UVicorn
bash uvicorn main:app --reload # ‘main’ 是你的主模块名‘app’ 是你的 FastAPI 实例名 6. 访问管理后台 默认情况下后台管理界面会在 /admin 路径下生成。你可以在浏览器中访问 http://localhost:8000/admin 来查看和使用管理后台。使用你定义的模型名称例如“User”作为菜单项来管理相应的数据。
pip install fastapi_amis_admin[cli]
pip install pydantic[dotenv]# View help
faa --help# Initialize a FastAPI-Amis-Admin project
faa new music --init# Initialize a FastAPI-Amis-Admin application
faa new music # Fast running project
faa run再回顾
uvicorn0.18.3
pydantic[dotenv]1.9.0
aiosqlite0.17.0
fastapi-amis-admin0.5.0,0.6.0
fastapi-user-auth0.5.0,0.6.0
fastapi-scheduler0.0.6,0.1.0
aiomysql
fastapi-config
aioredis
celery
flower
在这里我们让项目支持redis 以及rabbitmq
##创建一个项目如下图 ##rabbitmq的配置
#!/usr/bin/python3
# !--*-- coding: utf-8 --*--
import timefrom celery import Celery
from celery.utils.log import get_task_logger# 实例化 Celery
celery Celery(tasks, brokeramqp://wanghaibin:wanghaibin127.0.0.1:5672//)# 创建 logger以显示日志信息
celery_log get_task_logger(__name__)# 创建任务函数以订单(Order) 为例异步进行
celery.task
def create_order(name, quantity):# 5 seconds per 1 ordercomplete_time_per_item 5# Keep increasing depending on item quantity being orderedtime.sleep(complete_time_per_item * quantity)# 显示日志celery_log.info(fOrder Complete!)return {message: fHi {name}, Your order has completed!,order_quantity: quantity}#!/usr/bin/python3
#!--*-- coding: utf-8 --*--
from pydantic import BaseModel# Pydantic BaseModel
# Order class model for request body
class Order(BaseModel):customer_name: strorder_quantity: int##再看music models.py创建了表
from datetime import datetime
from typing import List, Optional
import sqlmodel
from fastapi_amis_admin.amis.components import ColumnImage, InputImage, InputRichText
from fastapi_amis_admin.models.enums import IntegerChoices
from fastapi_amis_admin.models.fields import Field
from fastapi_user_auth.auth.models import PkMixin, User
from sqlalchemy import Column, String, select
from sqlalchemy.orm import Sessionclass ArticleStatus(IntegerChoices):unpublished 0, 未发布published 1, 已发布inspection 2, 审核中disabled 3, 已禁用class Category(PkMixin, tableTrue):__tablename__ categoryname: str Field(title歌曲分类名, sa_columnColumn(String(100), uniqueTrue, indexTrue, nullableFalse))description: str Field(default, title描述, amis_form_itemtextarea)status: bool Field(False, title状态)articles: List[Article] sqlmodel.Relationship(back_populatescategory)class ArticleTagLink(sqlmodel.SQLModel, tableTrue):__tablename__ music_tagstag_id: Optional[int] Field(defaultNone, foreign_keytag.id, primary_keyTrue)music_id: Optional[int] Field(defaultNone, foreign_keyarticle.id, primary_keyTrue)class Tag(PkMixin, tableTrue):__tablename__ tagname: str Field(..., title标签名, sa_columnColumn(String(255), uniqueTrue, indexTrue, nullableFalse))articles: List[Article] sqlmodel.Relationship(back_populatestags, link_modelArticleTagLink)class Article(PkMixin, tableTrue):__tablename__ articletitle: str Field(title歌曲名, max_length200)img: str Field(None,title图片,max_length300,amis_form_itemInputImage(maxLength1, maxSize2 * 1024 * 1024, receiverpost:/admin/file/upload),amis_table_columnColumnImage(width100, height60, enlargeAbleTrue),)url: str Field(default, titlemp3 url, amis_form_itemtextarea)status: ArticleStatus Field(ArticleStatus.unpublished, titlestatus)content: str Field(..., title说明, amis_form_itemInputRichText())create_time: Optional[datetime] Field(default_factorydatetime.utcnow, title增加时间)source: str Field(default, title来源, max_length200)category_id: Optional[int] Field(defaultNone, foreign_keycategory.id, title分类)category: Optional[Category] sqlmodel.Relationship(back_populatesarticles)tags: List[Tag] sqlmodel.Relationship(back_populatesarticles, link_modelArticleTagLink)user_id: int Field(defaultNone, foreign_keyauth_user.id, title用户)user: User sqlmodel.Relationship()staticmethoddef check_update_permission(session: Session, user: User, item_id: List[str]):# 管理员可以修改全部文章, 并且可以批量修改.if user.has_requires(session, roles[admin]):return True# 非管理员,只能修改自己的文章,并且不可批量修改.if len(item_id) 1:return Falsestmt select(1).where(Article.id item_id[0], Article.user_id user.id)return bool(session.scalar(stmt))
admin.py表现的是菜单的链接
from datetime import datetime, timedelta
from typing import Any, Dict, Listfrom apps.music.models import Article, Category, Tag
from core.adminsite import site
from fastapi_amis_admin import admin
from fastapi_amis_admin.admin import AdminApp, PageSchemaAdmin
from fastapi_amis_admin.amis.components import PageSchema, TableColumn
from fastapi_amis_admin.crud.parser import LabelField, PropertyField
from fastapi_amis_admin.crud.schema import Paginator
from fastapi_amis_admin.models import Field
from fastapi_user_auth.auth.models import User
from pydantic import BaseModel
from sqlmodel.sql.expression import Select
from starlette.requests import Requestsite.register_admin
class BlogApp(admin.AdminApp):page_schema PageSchema(label音乐管理, iconfa fa-calculator)router_prefix /musicdef __init__(self, app: AdminApp):super().__init__(app)self.register_admin(ArticleAdmin,CategoryAdmin, TagAdmin)class CategoryAdmin(admin.ModelAdmin):page_schema PageSchema(label音乐分类管理, iconfa fa-folder)model Categorysearch_fields [Category.name]class TagAdmin(admin.ModelAdmin):page_schema PageSchema(label音乐标签管理, iconfa fa-tags)model Tagsearch_fields [Tag.name]link_model_fields [Tag.articles]class ArticleAdmin(admin.ModelAdmin):page_schema PageSchema(label音乐管理, iconfa fa-file)model Article# 配置列表展示字段list_display [#TableColumn(typetpl, label自定义模板列, tpla href${source} target_blankID:${id},Title:${title}/a),Article.id,Article.title.label(歌名),Article.img,Category.name,User.username,Article.create_time,Article.url,User.nickname.label(昵称), # 重命名字段;也可以使用sqlalchemy函数, 例如:#func.count(*).label(music_count), #注意在get_select中修改对应的sql查询语句LabelField(User.nickname.label(nickname2),Field(默认用户, title发布者), # 通过Field配置Amis表格列信息,Amis表单字段信息.),]# 配置模糊搜索字段search_fields [Article.title, Category.name, User.username]# 配置关联模型link_model_fields [Article.tags]# 读取查看表单字段read_fields [Article,PropertyField(namecategory, type_Category),PropertyField(nameuser, type_User),PropertyField(nametags, type_List[Tag]),]# 自定义查询选择器async def get_select(self, request: Request) - Select:sel await super().get_select(request)return sel.join(Category, isouterTrue).join(User, isouterTrue)# 权限验证async def has_page_permission(self, request: Request, obj: PageSchemaAdmin None, action: str None) - bool:return Trueasync def has_list_permission(self, request: Request, paginator: Paginator, filters: BaseModel None, **kwargs) - bool:# 用户未登录,不可按标题过滤文章,并且最多每页最多只能查看10条数据.return bool(await self.site.auth.requires(responseFalse)(request) or (paginator.perPage 10 and filters.title ))async def has_create_permission(self, request: Request, data: BaseModel, **kwargs) - bool:# 用户已登录,并且注册时间大于3天,才可以发布文章return bool(await self.site.auth.requires(responseFalse)(request)and request.user.create_time datetime.now() - timedelta(days3)) or await self.site.auth.requires(rolesadmin, responseFalse)(request)async def has_delete_permission(self, request: Request, item_id: List[str], **kwargs) - bool:# 必须管理员才可以删除文章.return await self.site.auth.requires(rolesadmin, responseFalse)(request)async def has_update_permission(self, request: Request, item_id: List[str], data: BaseModel, **kwargs) - bool:if not await self.site.auth.requires(responseFalse)(request):return Falseif item_id is None:return Truereturn await self.site.db.async_run_sync(Article.check_update_permission, request.user, item_id)async def on_create_pre(self, request: Request, obj: BaseModel, **kwargs) - Dict[str, Any]:data await super().on_create_pre(request, obj, **kwargs)# 创建新文章时,设置当前用户为发布者data[user_id] request.user.idreturn data
main.py代码
from starlette.responses import RedirectResponse
from fastapi import FastAPI
from core.adminsite import site
from core.settings import settings
from sqlmodel import SQLModel
from aioredis import create_redis_pool, Redis
from apps.rabbitmq.model import Order
from apps.rabbitmq.celery_worker import create_order
app FastAPI(debugsettings.debug)
# 安装应用
from apps import admin
admin.setup(app.router, site)
# 安装应用blog
from apps import music
music.setup(app)from apps import siteconfig
siteconfig.setup(app)# from apps import project
# project.setup(app)
# 挂载后台管理系统
site.mount_app(app)app.get(/)
async def index():return RedirectResponse(urlsite.router_path)app.on_event(startup)
async def startup():from core.adminsite import authawait site.db.async_run_sync(SQLModel.metadata.create_all, is_sessionFalse)await auth.create_role_user(admin)app.state.redis await get_redis_pool()from core.adminsite import schedulerscheduler.start()async def get_redis_pool() - Redis: #redisredis await create_redis_pool(fredis://:127.0.0.1:6379/0?encodingutf-8)return redisapp.on_event(shutdown)
async def shutdown_event():app.state.redis.close()await app.state.redis.wait_closed()app.post(/order)
def add_order(order: Order):create_order.delay(order.customer_name, order.order_quantity)return {message: Order Received! Thank you for your patience.}
这里还有一个core的目录。主要是解决数据据的配置 setting.py
import os
from pathlib import Path
from typing import Listfrom fastapi_amis_admin.admin.settings import Settings as AmisSettingsBASE_DIR Path(__file__).resolve().parent.parentclass Settings(AmisSettings):name: str JJSOShost: str 127.0.0.1port: int 7555secret_key: str ssswessssallow_origins: List[str] Nonesettings Settings(_env_fileos.path.join(BASE_DIR, .env))
adminsite.py
from core.settings import settings
from fastapi_user_auth.site import AuthAdminSite
site AuthAdminSite(settings)
auth site.auth
from fastapi_scheduler import SchedulerAdmin
scheduler SchedulerAdmin.bind(site)
界面 文章转载自: http://www.morning.yrjkp.cn.gov.cn.yrjkp.cn http://www.morning.nbgfz.cn.gov.cn.nbgfz.cn http://www.morning.wqfrd.cn.gov.cn.wqfrd.cn http://www.morning.fbmjl.cn.gov.cn.fbmjl.cn http://www.morning.jxjrm.cn.gov.cn.jxjrm.cn http://www.morning.cwqln.cn.gov.cn.cwqln.cn http://www.morning.ybhjs.cn.gov.cn.ybhjs.cn http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn http://www.morning.hcsnk.cn.gov.cn.hcsnk.cn http://www.morning.gqfks.cn.gov.cn.gqfks.cn http://www.morning.knpmj.cn.gov.cn.knpmj.cn http://www.morning.jcbjy.cn.gov.cn.jcbjy.cn http://www.morning.jwncx.cn.gov.cn.jwncx.cn http://www.morning.njfgl.cn.gov.cn.njfgl.cn http://www.morning.stflb.cn.gov.cn.stflb.cn http://www.morning.xoaz.cn.gov.cn.xoaz.cn http://www.morning.sgrwd.cn.gov.cn.sgrwd.cn http://www.morning.gprzp.cn.gov.cn.gprzp.cn http://www.morning.yprnp.cn.gov.cn.yprnp.cn http://www.morning.jpbpc.cn.gov.cn.jpbpc.cn http://www.morning.ryztl.cn.gov.cn.ryztl.cn http://www.morning.pwdgy.cn.gov.cn.pwdgy.cn http://www.morning.ynbyk.cn.gov.cn.ynbyk.cn http://www.morning.lzdbb.cn.gov.cn.lzdbb.cn http://www.morning.fdfsh.cn.gov.cn.fdfsh.cn http://www.morning.pamdeer.com.gov.cn.pamdeer.com http://www.morning.wlqll.cn.gov.cn.wlqll.cn http://www.morning.xqqcq.cn.gov.cn.xqqcq.cn http://www.morning.kscwt.cn.gov.cn.kscwt.cn http://www.morning.rqwmt.cn.gov.cn.rqwmt.cn http://www.morning.madamli.com.gov.cn.madamli.com http://www.morning.hksxq.cn.gov.cn.hksxq.cn http://www.morning.jpnw.cn.gov.cn.jpnw.cn http://www.morning.kjcfz.cn.gov.cn.kjcfz.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.bpmnc.cn.gov.cn.bpmnc.cn http://www.morning.pwhjr.cn.gov.cn.pwhjr.cn http://www.morning.zmwd.cn.gov.cn.zmwd.cn http://www.morning.mwkwg.cn.gov.cn.mwkwg.cn http://www.morning.fqhbt.cn.gov.cn.fqhbt.cn http://www.morning.hdrsr.cn.gov.cn.hdrsr.cn http://www.morning.xkjqg.cn.gov.cn.xkjqg.cn http://www.morning.ggrzk.cn.gov.cn.ggrzk.cn http://www.morning.ltcnd.cn.gov.cn.ltcnd.cn http://www.morning.zyrcf.cn.gov.cn.zyrcf.cn http://www.morning.hpggl.cn.gov.cn.hpggl.cn http://www.morning.tbplf.cn.gov.cn.tbplf.cn http://www.morning.tpssx.cn.gov.cn.tpssx.cn http://www.morning.xyjlh.cn.gov.cn.xyjlh.cn http://www.morning.xfncq.cn.gov.cn.xfncq.cn http://www.morning.yhdqq.cn.gov.cn.yhdqq.cn http://www.morning.qyqdz.cn.gov.cn.qyqdz.cn http://www.morning.bmts.cn.gov.cn.bmts.cn http://www.morning.dgfpp.cn.gov.cn.dgfpp.cn http://www.morning.fssmx.com.gov.cn.fssmx.com http://www.morning.rkwlg.cn.gov.cn.rkwlg.cn http://www.morning.qnksk.cn.gov.cn.qnksk.cn http://www.morning.xhrws.cn.gov.cn.xhrws.cn http://www.morning.ldzxf.cn.gov.cn.ldzxf.cn http://www.morning.shxmr.cn.gov.cn.shxmr.cn http://www.morning.wtbzt.cn.gov.cn.wtbzt.cn http://www.morning.xkhhy.cn.gov.cn.xkhhy.cn http://www.morning.hdscx.cn.gov.cn.hdscx.cn http://www.morning.jtfcd.cn.gov.cn.jtfcd.cn http://www.morning.bklkt.cn.gov.cn.bklkt.cn http://www.morning.hrtwt.cn.gov.cn.hrtwt.cn http://www.morning.jygsq.cn.gov.cn.jygsq.cn http://www.morning.hgsylxs.com.gov.cn.hgsylxs.com http://www.morning.qwmpn.cn.gov.cn.qwmpn.cn http://www.morning.tlpsd.cn.gov.cn.tlpsd.cn http://www.morning.mzhjx.cn.gov.cn.mzhjx.cn http://www.morning.rkfwr.cn.gov.cn.rkfwr.cn http://www.morning.rdtp.cn.gov.cn.rdtp.cn http://www.morning.jcxyq.cn.gov.cn.jcxyq.cn http://www.morning.jqmqf.cn.gov.cn.jqmqf.cn http://www.morning.yhtnr.cn.gov.cn.yhtnr.cn http://www.morning.rnjgh.cn.gov.cn.rnjgh.cn http://www.morning.qnsmk.cn.gov.cn.qnsmk.cn http://www.morning.kzcz.cn.gov.cn.kzcz.cn http://www.morning.plqkz.cn.gov.cn.plqkz.cn