api的工具集合

cocktail-apikit的Python项目详细描述


鸡尾酒套餐

将在所有新的api项目中使用的工具集合,包括:bottle、marshmallow、mongo和aws

apikit structure

依赖关系

  • 皮蒙戈:3.7.2
  • 棉花糖:2.16.3
  • 瓶:0.12.16
  • APISpec:0.39.0
  • BOTO3:1.9.115
  • 波托科尔:1.12.115

用法示例

一。安装鸡尾酒APIKIT

pip install cocktail-apikit

2.创建演示项目

2.1推荐API项目结构
example/
    __init__.py

    settings.py
    application.py

    config/
        database.ini
    api/
        __init__.py
        demo.py

    schema/
        __init__.py
        demo.py

2.2纯文本配置文件database.ini

使用$var_name可以支持环境变量,如果指定了api_env,则相应的api_env配置 将重载默认配置 小心INI文件中定义的所有键都应在项目级设置类中声明

[default]; Support Environment variable API_ENV=$API_ENV COLLECTION_NAME=exampleAPI_DEFAULT_LIMIT=40BUCKET_NAME=dev.ioMONGODB_URI=localhost:27017[development];DB_NAME = develop_dbDEMO_COLLECTION=demo_collection[test];DB_NAME = test_dbDEMO_COLLECTION=demo_collection

2.3项目级设置文件settings.py的内容
importosfromcocktail_apikitimportDefaultSettingsclassSettings(DefaultSettings):# specify configuration file names to load configuration from file# Be aware, any configuration fields in configuration file should be # declare in the settings class  or any its super class, just # to make us have better IDE auto-complete help_config_files=['config/database.ini']# **REQUIRED: for Settings class can find the files in the _config_files attribute in any situation**BASE_DIR=os.path.dirname(os.path.abspath(__file__))

schema/demo.py中演示模式的2.4内容
frommarshmallowimportfieldsfromcocktail_apikitimportBaseSchemaclassDemoSchema(BaseSchema):"""    BaseSchema included some common fields: id, created_at, updated_at, deleted_at;    Also contains some util method from SchemaMongoMixin for communicate with mongo db    """name=fields.Str()

api/demo.py中端点资源的2.5内容
fromsettingsimportSettingsfrombottleimportrequestfromschema.demoimportDemoSchemafromcocktail_apikitimport(ResourcePlugin,route_mark,ValidationError,MongoDBManager,enable_cors,BottleMongoQueryBuilder,Pagination,HTTP_DELETE_OK,HTTP_UPDATE_OK,HTTP_OK)demo_db=MongoDBManager(Settings.mongo_config_for_collection('demo'))# specify a Config option name or be the given namedemo_schema=DemoSchema()classDemoResource(ResourcePlugin):# a simple demo endpoint@route_mark('/index')defindex(self):return'hello cocktail apikit'@route_mark('/demos')@enable_cors# allow cors for endpointdeflist_demo(self):mongo_query_builder=BottleMongoQueryBuilder(request,demo_schema)mongo_query=mongo_query_builder.to_mongo_query()results,count=demo_db.filter(mongo_query)pagination=Pagination(mongo_query,results,count)returnpagination.serialize(demo_schema)@route_mark('/demos','POST')defcreate_demo(self):payload=request.jsoncleaned_obj,errors=demo_schema.load(payload)iferrors:raiseValidationError(errors)created_ids,errors=demo_db.create(cleaned_obj)iferrors:raiseValidationError(errors)return{"ids":created_ids}@route_mark('/demos/<demo_id>','DELETE')defsoft_delete_demo(self,demo_id):delete_condition={'_id':demo_id}result,errors=demo_db.delete(delete_condition)iferrors:raiseValidationError(errors)ifnotresult.raw_result['updatedExiting']:raiseValidationError({'msg':'Object does not exist or already deleted!'})return{'msg':HTTP_DELETE_OK}@route_mark('/demos/<demo_id>',['PUT','PATCH'])defupdate_demo(self,demo_id):payload=request.jsoncondition={'_id':demo_id}result,errors=demo_db.update(condition,payload)iferrors:raiseValidationError(errors)ifnotresult.raw_result['updatedExisting']:raiseValidationError({'msg':'Does not found any thing to udpate'})return{'msg':HTTP_UPDATE_OK}@route_mark('/auth',auth=True)# Specify endpoint is authentication neededdefauth_demo(self):return{'msg':HTTP_OK}

2.6主要应用内容。py

frombottleimportBottlefromcocktail_apikitimportFlexibleJsonPlugin,CorsPlugin,APP_ERROR_HANDLERfromapi.demoimportDemoResourceapp=Bottle()# install FlexibleJsonPlugin to enable handle more data typeapp.install(FlexibleJsonPlugin())# install endpoint resource class`s instanceapp.install(DemoResource())app.install(CorsPlugin())#config application object's error handlersapp.error_handler=APP_ERROR_HANDLERif__name__=="__main__":app.run(port=8000,debug=True,reloader=True)

2.7然后我们可以运行“python application.py”,并访问
### Create a demoPOST http://localhost:8000/demos{  "name": "test1"}### list all demosGET  http://localhost:8000/demos### update a demoPUT http://localhost:8000/demos/<demo_id>### delete a demoDELETE http://localhost:8000/demos/<demo_id>

三。端点身份验证

如果要创建具有身份验证需要的端点,可以按照以下示例操作:

frombottleimportrequestfromcocktail_apikitimportAuthentication,ResourcePlugin,route_mark,HTTP_OKclassMyAuthentication(Authentication):defis_authenticated(self,*args,**kwargs):authentcation_data=request.headers.get('authorization')returnauthentcation_data=='authorization'classAuthDemoResource(ResourcePlugin):authentication=MyAuthentication()@route_mark('/auth',auth=True)#Default auth=False which means does not need authenticationdefauth_endpoint(self):return{'msg':HTTP_OK}

当您未经授权请求http://localhost:80000/auth时,数据将引发未经授权的错误 当使用Authorization=authorization执行上述请求时,将返回{ "msg": "OK" }

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java无法使用JSF访问托管bean方法   java是制作具有多值类型的HashMap的正确方法   javafx中TicTacToe的java更新UI   windows Java文件。getCanonicalFile()无法处理冒号“:”   java在一个布局屏幕中创建多个(26)按钮   java Android Studio:Gradle构建完成,有251个错误   我们如何在Java上为callfireapiclient编写单元/集成测试?   java无法将1715UTC转换为本地/gmt类型   具有已定义的数字序列的JAVA循环   Java程序正在netbeans中编译,但未在CMD中编译,包不存在   java Android构造函数和onCreate()之间有什么区别?   java配置弹性搜索结果评分   java LibGDX纹理是否可绘制?   java如何在Android中设置应用程序默认打开pdf   java是否有一种创造性的方法将多个参数传递给contentEquals()方法?   java在Android上存储Ed25519私钥