{ "info": { "author": "sparrow", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Django :: 1.9", "Framework :: Django :: 2.2", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP" ], "description": "## sparrow cloud\u7ec4\u4ef6 ##\n\n[Service Discovery](#service_registry)\n\n[Cache Service](#cache_manager)\n\n[API Permission Register](#api-permission-register)\n\n[RestClient](#restclient)\n\n[RequestsClient](#requestsclient)\n\n[Message_Client](#message_client)\n\n[Rabbitmq_Consumer](#rabbitmq_consumer)\n\n[Table_API](#table_api)\n\n[Api Schema Register](#api-schema-register)\n\n[service_configuration](#service_configuration)\n\n## django\u4e2d\u95f4\u4ef6 ##\n[JWT Middleware](#jwtmiddleware)\n\n[Request Method Middleware](#method_middleware)\n\n[Permission Verify Middleware](#permission_middleware)\n\n\n## rest_framework\u4e2d\u95f4\u4ef6 ##\n[UserID Authentication](#useridauthentication)\n\n\n## installation ##\n\n pip install sparrowcloud\n\n## \u6d4b\u8bd5\u8fd0\u884c ##\n\n \u8fd0\u884c\u6240\u6709\u6d4b\u8bd5:\n py.test\n \u8fd0\u884c\u5355\u4e2a\u6d4b\u8bd5:\n py.test tests/test_rest_client.py\n\n## service_registry\n\n> \u63cf\u8ff0\uff1a consul\u670d\u52a1\u53d1\u73b0\n> sparrow_cloud \u9879\u76ee\u7684\u8bb8\u591a\u7ec4\u4ef6\u5bf9 consul\u670d\u52a1\u53d1\u73b0 \u6709\u91cd\u5ea6\u4f9d\u8d56, \u9700\u914d\u7f6e consul\n\n```\n# \u5728 settings\u91cc\u9762\u914d\u7f6e consul\u53c2\u6570\nCONSUL_CLIENT_ADDR = {\n \"HOST\": os.environ.get(\"CONSUL_IP\", \"127.0.0.1\"), # \u5728k8s\u4e0a\u7684\u73af\u5883\u53d8\u91cf\u7c7b\u578b\uff1a\u53d8\u91cf/\u53d8\u91cf\u5f15\u7528\n \"PORT\": os.environ.get(\"CONSUL_PORT\", 8500)\n}\n\n\u4f7f\u7528\u65b9\u6cd5\uff1a\nfrom sparrow_cloud.registry.service_discovery import consul_service\n> consul_service(SERVICE_CONF)\n> \"127.0.0.1:8001\"\n\n\u53c2\u6570\u8bf4\u660e:\n SERVICE_CONF = {\n \"ENV_NAME\": \"PERMISSION_REGISTER_NAME_HOST\",\n \"VALUE\": \"sprrow-permission-svc\"\n },\n ENV_NAME: \u7528\u6765\u8986\u76d6 consul \u7684\u73af\u5883\u53d8\u91cf\u540d\n VALUE: consul\u670d\u52a1\u6ce8\u518c\u540d\u5b57\n\u5982\u679c\u6709\u73af\u5883\u53d8\u91cf PERMISSION_REGISTER_NAME_HOST \u5b58\u5728, \u5219\u8986\u76d6 consul\n\nconsul_service: \u8fd4\u56de\u5730\u5740\u7684\u65b9\u6cd5:\n 1 \u5982\u679c\u6709 SERVICE_SETTINGS_KEY_NAME_HOST (\u53c2\u6570\u540d\u5b57_HOST)\u73af\u5883\u53d8\u91cf\u5b58\u5728, \u5219\u76f4\u63a5\u8fd4\u56de\u8be5\u73af\u5883\u53d8\u91cf\u7684\u503c\u4f5c\u4e3a\u5730\u5740.\n 2 \u5982\u679c\u6ca1\u6709, \u5219\u4f7f\u7528 consul \u670d\u52a1\u53d1\u73b0\u4e2d\u5fc3\u8fd4\u56de\u5730\u5740\n```\n\n## cache_manager\n\n> \u63cf\u8ff0 \uff1a cache_manager \u4f1a\u628amodel\u7684get\u65b9\u6cd5\u4f7f\u7528\u7f13\u5b58\n\n```\n\u4f9d\u8d56settings\u914d\u7f6e\uff1a\n\nimport redis\nCACHE_REDIS_POOL = redis.ConnectionPool(\n host=REDIS_HOST,\n port=REDIS_PORT,\n password=REDIS_PASSWORD,\n decode_responses=True)\n\n\n\u4f7f\u7528\u65b9\u6cd5\uff1a\n# \u5728models\u6587\u4ef6\u4e2d\u5bfc\u5165\nfrom sparrow_cloud.sparrow_cloud.cache.cache_manager import CacheManager\n\n# \u5728\u9700\u8981\u4f7f\u7528\u7f13\u5b58\u7684model\u4e2d\u52a0\u5165\nobjects = CacheManager()\ndemo\u4e2d\u53ef\u67e5\u770b\u793a\u4f8b\nmodel \u793a\u4f8b\u8def\u5f84\uff0c sparrow_demo/models.py\n```\n\n## JWTMiddleware\n\n> \u63cf\u8ff0\uff1aToken \u89e3\u6790\n> \u914d\u7f6e JWTMiddleware \u4e2d\u95f4\u4ef6\u9700\u8981\u7684\u53c2\u6570\n\n```\n\u6ce8\u518c\u4e2d\u95f4\u4ef6\nMIDDLEWARE = (\n 'sparrow_cloud.middleware.jwt_middleware.JWTMiddleware', # \u653e\u6700\u4e0a\u5c42\n\n\u5c06\u4ee5\u4e0b\u53c2\u6570\u6dfb\u52a0\u5230settings.py\nJWT_MIDDLEWARE = {\n \"JWT_SECRET\": \"\", # JWT_SECRET, \u5fc5\u586b\n}\n```\n\n## UserIDAuthentication\n> \u63cf\u8ff0\uff1a user_id \u89e3\u6790\n> \u914d\u7f6e UserIDAuthentication \u8ba4\u8bc1\u9700\u8981\u7684\u53c2\u6570(\u4ec5\u517c\u5bb9django2.2\u4ee5\u4e0a\u7248\u672c)\n\n```\nSPARROW_AUTHENTICATION = {\n \"USER_CLASS_PATH\": \"sparrow_cloud.auth.user.User\",\n}\n\n# \u53c2\u6570\u8bf4\u660e\uff1a USER_CLASS_PATH\uff1a \u8def\u5f84\u4e2d\u7684User\u4e3a\u4e2d\u95f4\u4ef6\u7684User\u6a21\u7248\uff0c \u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u9700\u6c42\u91cd\u65b0\u521b\u5efaUser\uff0c \u5e76\u5c06\u81ea\u5df1\u7684User\u8def\u5f84\u6309\u7167\u6a21\u7248\u683c\u5f0f\u653e\u5230\uff1aUSER_CLASS_PATH\u4e0b\n\n# \u6ce8\u518c\u4e2d\u95f4\u4ef6\n\nREST_FRAMEWORK = {\n 'DEFAULT_AUTHENTICATION_CLASSES': (\n 'sparrow_cloud.auth.user_id_authentication.UserIDAuthentication',\n ),\n}\n```\n\n## API Permission Register\n\n> \u63cf\u8ff0\uff1a \u4e3b\u52a8\u6ce8\u518cAPI\u5230\u6743\u9650\u670d\u52a1\n> \u914d\u7f6e permission_command \u9700\u8981\u7684\u53c2\u6570\n\n```\n settings \u914d\u7f6e:\n # \u6ce8\u518c\u670d\u52a1\u5230 settings \u4e0b\u7684 INSTALLED_APPS\u4e2d\n INSTALLED_APPS = [\n \"sparrow_cloud.apps.permission_command\",\n ]\n\n # \u672c\u670d\u52a1\u914d\u7f6e\n SERVICE_CONF = {\n \"NAME\": \"\", # \u672c\u670d\u52a1\u7684\u540d\u79f0\n }\n\n # \u6ce8\u518c\u670d\u52a1\u7684\u914d\u7f6e\n SPARROW_PERMISSION_REGISTER_CONF = {\n \"PERMISSION_SERVICE\": {\n \"ENV_NAME\": \"PERMISSION_SERVICE_HOST\",\n \"VALUE\": \"xxxxx-svc\",\n },\n \"API_PATH\": \"/api/permission_i/register/\",\n }\n\n \u8c03\u7528\u65b9\u5f0f\uff1a\n python3 manage.py register_api_permission -d 2\n\n```\n## METHOD_MIDDLEWARE\n> \u517c\u5bb9\u963f\u91cc\u4e0d\u652f\u6301 put/delete \u8bf7\u6c42\n> \u914d\u7f6eMETHOD_MIDDLEWARE\u9700\u8981\u7684\u53c2\u6570\n\n```\n # \u5c06\u4ee5\u4e0b\u53c2\u6570\u6dfb\u52a0\u5230settings.py #\n METHOD_MIDDLEWARE = {\n \"METHOD_MAP\": ('PUT', 'DELETE',),\n }\n # \u6ce8\u518c METHOD_MIDDLEWARE\n MIDDLEWARE_CLASSES = (\n 'sparrow_cloud.middleware.methodconvert.MethodConvertMiddleware', #\u517c\u5bb9\u963f\u91cc\u8bf7\u6c42\u65b9\u5f0f\u4e2d\u95f4\u4ef6\n )\n```\n\n## PERMISSION_MIDDLEWARE\n> \u6743\u9650\u4e2d\u95f4\u4ef6\n> \u914d\u7f6ePERMISSION_MIDDLEWARE\u9700\u8981\u7684\u53c2\u6570\n\n```\n# \u5c06\u4ee5\u4e0b\u53c2\u6570\u6dfb\u52a0\u5230settings.py\nPERMISSION_MIDDLEWARE = {\n \"PERMISSION_SERVICE\": {\n # ENV_NAME \u4e3a\u8986\u76d6consul\u7684\u9ed8\u8ba4\u503c, \u73af\u5883\u53d8\u91cf\u540d\u79f0\u793a\u4f8b\uff1a\u670d\u52a1\u540d\u79f0_HOST\uff0c \u53ea\u9700\u8981\u7ed9\u4e00\u4e2a\u73af\u5883\u53d8\u91cf\u7684NAME\uff0c\u4e0d\u9700\u8981\u7ed9VALUE\n \"ENV_NAME\": \"\",\n # VALUE \u4e3a\u670d\u52a1\u53d1\u73b0\u7684\u6ce8\u518c\u540d\u79f0\n \"VALUE\": \"\",\n },\n \"API_PATH\": \"\",\n \"FILTER_PATH\": [''], # \u4f7f\u7528\u6743\u9650\u9a8c\u8bc1\u4e2d\u95f4\u4ef6\uff0c \u5982\u6709\u4e0d\u9700\u8981\u9a8c\u8bc1\u7684URL\uff0c \u53ef\u6dfb\u52a0\u5230\u5217\u8868\u4e2d\n # \u662f\u5426\u542f\u7528\u6743\u9650\u4e2d\u95f4\u4ef6\uff0c SKIP_PERMISSION:True, \u5219\u8df3\u8fc7\u4e2d\u95f4\u4ef6\uff0c\u5982\u679c\u4e0d\u914d\u7f6eSKIP_PERMISSION\uff0c\u6216\u8005SKIP_PERMISSION:False\uff0c\u5219\u4e0d\u8df3\u8fc7\u4e2d\u95f4\u4ef6\n \"SKIP_PERMISSION\": False\n}\n\n\u6ce8\u518c\u4e2d\u95f4\u4ef6\nMIDDLEWARE = [\n 'sparrow_cloud.middleware.api_permission.PermissionMiddleware',\n]\n\nPS: \u5982\u679c\u672a\u914d\u7f6e CONSUL_CLIENT_ADDR, \u9700\u8981\u914d\u7f6e\u8be5\u53c2\u6570, \u6743\u9650\u4e2d\u95f4\u4ef6\u4f9d\u8d56 consul\n```\n\n## restclient\n\n> \u670d\u52a1\u8c03\u7528\u4e2d\u95f4\u4ef6\n\n```\n from sparrow_cloud.restclient import rest_client\n rest_client.post(SERVICE_CONF, api_path, json=api_list)\n```\n \u53c2\u6570\u8bf4\u660e:\n SERVICE_CONF = {\n \"ENV_NAME\": \"PERMISSION_REGISTER_NAME_HOST\",\n \"VALUE\": \"sprrow-permission-svc\",\n },\n ENV_NAME: \u7528\u6765\u8986\u76d6 consul \u7684\u73af\u5883\u53d8\u91cf\u540d\n VALUE: consul\u670d\u52a1\u6ce8\u518c\u540d\u5b57\n ps:\n \u5269\u4f59\u53c2\u6570\u4e0e requests.get/post \u7b49\u65b9\u6cd5\u4fdd\u6301\u4e00\u81f4\n\n\n## requestsclient\n\n> \u670d\u52a1\u8c03\u7528\u4e2d\u95f4\u4ef6\uff08\u8fd4\u56de\u7ed3\u679c\u672a\u5c01\u88c5\uff09\n\n```\n from sparrow_cloud.restclient import requests_client\n requests_client.post(SERVICE_CONF, api_path, json=api_list)\n```\n \u53c2\u6570\u8bf4\u660e:\n SERVICE_CONF = {\n \"ENV_NAME\": \"PERMISSION_REGISTER_NAME_HOST\",\n \"VALUE\": \"sprrow-permission-svc\",\n },\n ENV_NAME: \u7528\u6765\u8986\u76d6 consul \u7684\u73af\u5883\u53d8\u91cf\u540d\n VALUE: consul\u670d\u52a1\u6ce8\u518c\u540d\u5b57\n ps:\n \u5269\u4f59\u53c2\u6570\u4e0e requests.get/post \u7b49\u65b9\u6cd5\u4fdd\u6301\u4e00\u81f4 \n\n\n## message_client\n\n> \u9ebb\u96c0\u4efb\u52a1\u53d1\u9001\n> 1. \u6ce8\u518c\u6d88\u606f 2. \u53d1\u9001\u6d88\u606f\n\n```\n settings\u914d\u7f6e\n MESSAGE_SENDER_CONF = {\n \"SERVICE_CONF\": {\n \"ENV_NAME\": \"MESSAGE_REGISTER_NAME_HOST\",\n \"VALUE\": \"sparrow-task-test-svc\",\n },\n \"API_PATH\": \"/api/sparrow_task/producer/send/\",\n }\n ps: \n MESSAGE_SENDER_CONF # \u914d\u7f6e\n SERVICE_CONF # message_client\u4f9d\u8d56consul\n API_PATH # message_client \u53d1\u9001\u6d88\u606f\u5730\u5740\n\n \u8c03\u7528\u65b9\u5f0f\uff1a\n from sparrow_cloud.message_service.sender import send_task\n data = send_task(exchange=exchange, \n routing_key=routing_key, \n message_code=message_code, \n *args,\n **kwargs)\n ps:\n exchange: \u4ea4\u6362\u673a\n routing_key: \u8def\u7531\n message_code: \u6d88\u606f\u7801\n```\n\n\n## rabbitmq_consumer\n\n> \u9ebb\u96c0\u4efb\u52a1\u6d88\u8d39\n> 1. \u83b7\u53d6\u961f\u5217 2. \u6d88\u8d39\u4efb\u52a1\n```\n settings\u914d\u7f6e\n\n SPARROW_RABBITMQ_CONSUMER_CONF = {\n\n \"MESSAGE_BROKER_CONF\": {\n \"USER_NAME\": \"test\",\n \"PASSWORD\": \"jfdskafsake\",\n \"VIRTUAL_HOST\": \"sparrow_test\",\n \"BROKER_SERVICE_CONF\": {\n \"ENV_NAME\": \"SPARROW_BROKER_HOST\",\n \"VALUE\": \"sparrow-demo\",\n },\n },\n \"MESSAGE_BACKEND_CONF\": {\n \"BACKEND_SERVICE_CONF\": {\n \"ENV_NAME\": \"SPARROW_BACKEND_HOST\",\n \"VALUE\": \"sparrow-demo\",\n },\n \"API_PATH\": \"/api/sparrow_task/task/update/\",\n }\n }\n\n QUEUE_CONF_1 = {\n \"QUEUE\": \"ORDER_PAY_SUC_ALL\",\n \"TARGET_FUNC_MAP\": {\n \"ORDER_PAY_SUC_ONLINE\": \"message_service.task.task1\",\n },\n }\n\n\n ps:\n SPARROW_RABBITMQ_CONSUMER_CONF # consumer\u7684\u914d\u7f6e\n MESSAGE_BROKER_CONF # rabbitmq\u914d\u7f6e\n USER_NAME # \u7528\u6237\u540d\n PASSWORD # \u5bc6\u7801\n VIRTUAL_HOST # \u865a\u62df\u4e3b\u673a\n BROKER_SERVICE_CONF # \u4f9d\u8d56consul\u670d\u52a1\u7684\u914d\u7f6e\n MESSAGE_BACKEND_CONF\n BACKEND_SERVICE_CONF # \u4f9d\u8d56consul\u670d\u52a1\u7684\u914d\u7f6e\n API_PATH # api \u8def\u5f84\n QUEUE_CONF_1 # \u961f\u5217\u7684\u914d\u7f6e\n QUEUE # \u961f\u5217\u540d\u79f0\n TARGET_FUNC_MAP # \u961f\u5217\u6d88\u8d39\u7684\u4efb\u52a1\uff08\u5b57\u5178\u4e2d\u7684\u952e\u4e3amessage code\uff0c\u5bf9\u5e94\u7684\u503c\u4e3a\u6267\u884c\u8be5\u6d88\u606f\u7684\u4efb\u52a1\u51fd\u6570\u8def\u5f84\u5b57\u7b26\u4e32\uff09\n\n\n \u8c03\u7528\u65b9\u5f0f\uff1a\n \u6ce8\u518c\u670d\u52a1\u5230 settings \u4e0b\u7684 INSTALLED_APPS\u4e2d\n\n INSTALLED_APPS = [\n \"sparrow_cloud.apps.message_service\",\n ]\n\n \u8c03\u7528\u547d\u4ee4\uff1a\n python3 manage.py rabbitmq_consumer --queue QUEUE_CONF_1\n\n ps\uff1a\n \u53c2\u6570\u8bf4\u660e\n --queue \uff1a \u6307\u5b9a\u53d1\u9001\u961f\u5217\u914d\u7f6e\u540d\u79f0\uff0c \u53c2\u7167settings\u4e2dQUEUE_CONF_1\u914d\u7f6e\n\n\n```\n\n\n## table_api\n> \u63a5\u53d7\u67e5\u8be2\u6761\u4ef6\u8fd4\u56dedjango model \u5e8f\u5217\u5316\u540e\u7684\u6570\u636e\n> \u5206\u4e3aserver\u7aef\u548cclient\u7aef\n\n```\n\n # server \u7aef\u914d\u7f6e\n # settings\u6ce8\u518c\u670d\u52a1\n INSTALLED_APPS = [\n \"sparrow_cloud.apps.table_api\",\n ]\n url\u914d\u7f6e\n urlpatterns = [\n path('table/api/', include(\"sparrow_cloud.apps.table_api.urls\")),\n ]\n\n\n # client\u7aef\u8c03\u7528 \n from sparrow_cloud.restclient import rest_client\n SERVICE_CONF = {\n \"ENV_NAME\": \"PERMISSION_REGISTER_NAME_HOST\",\n \"VALUE\": \"sprrow-permission-svc\"\n }\n payload = {\n \"app_lable_model\":\"app_lable.model\",\n \"filter_condition\":{\"product_id\":\"74101\"}\n }\n response = rest_client.get(SERVICE_CONF, api_path='/table/api/', json=payload)\n # \u8fd4\u56de\u7684\u6570\u636e\u7ed3\u6784\uff1a{'code': 0, 'message': 'ok', 'data': [{}]}\n\n\n ps:\n app_lable_model: app_name.model(app_name:INSTALLED_APPS\u91cc\u9762\u6ce8\u518c\u7684\u670d\u52a1\u7684\u540d\u5b57, model:app_lable\u4e0b\u7684model\u540d\u5b57\uff0c\u4e0d\u533a\u5206\u5927\u5c0f\u5199)\n filter_condition: \u8fc7\u6ee4\u6570\u636e\uff0c kwargs\n server\u7aef\u4f7f\u7528orm filter\u67e5\u8be2\u6570\u636e\uff0c\u5f53\u524d\u7248\u672c\u4e0d\u652f\u6301order_by\n```\n\n## API SCHEMA REGISTER\n>\u63cf\u8ff0\uff1a\u4e3b\u52a8\u6ce8\u518cAPI \u63cf\u8ff0\u5230\u6587\u6863\u670d\u52a1 \u914d\u7f6eschema_command \u9700\u8981\u7684\u53c2\u6570\n```\n settings \u914d\u7f6e:\n # \u6ce8\u518c\u670d\u52a1\u5230 settings \u4e0b\u7684 INSTALLED_APPS\u4e2d\n INSTALLED_APPS = [\n \"sparrow_cloud.apps.schema_command\",\n ]\n\n # \u672c\u670d\u52a1\u914d\u7f6e\n SERVICE_CONF = {\n \"NAME\": \"\", # \u672c\u670d\u52a1\u7684\u540d\u79f0\n }\n\n # \u6587\u6863\u670d\u52a1\u7684\u914d\u7f6e\n SPARROW_SCHEMA_REGISTER_CONF = {\n \"SCHEMA_SERVICE\": {\n \"ENV_NAME\": \"SCHEMA_SERVICE_HOST\",\n \"VALUE\": \"sparrow-schema-svc\",\n },\n \"API_PATH\": \"/api/schema_i/register/\",\n }\n\n \u8c03\u7528\u65b9\u5f0f:\n python3 manage.py register_api_schema\n \u4f7f\u7528\u8bf4\u660e:\n 1\u3001view\u652f\u6301@api_view\u6ce8\u89e3\u65b9\u5f0f\uff0cview_class\u652f\u6301GenericApiView\uff0cGenericViewSet\u53ca\u5176\u5b50\u7c7b\n 2\u3001\u63a5\u53e3\u63cf\u8ff0\u4e66\u5199\u5728view\u51fd\u6570\u6216\u8005view_class\u7684__doc__\u4e0a\uff0c\u5efa\u8bae\u4f7f\u7528markdown\u683c\u5f0f\uff0c\u5c55\u793a\u66f4\u7f8e\u89c2\n\n```\n>\u63a5\u53e3\u63cf\u8ff0\u4ee3\u7801\u793a\u4f8b\n```python\nfrom rest_framework.decorators import api_view\nfrom rest_framework.generics import RetrieveUpdateDestroyAPIView\nfrom rest_framework import generics\nfrom rest_framework.viewsets import ModelViewSet\n@api_view(('GET',))\ndef get_user(request):\n \"\"\"\n ### \u83b7\u53d6\u7528\u6237\u4fe1\u606f ####\n\n \u8bf7\u6c42\u53c2\u6570 id, \u7528\u6237id\n \u8fd4\u56de\n {\n \"user_id\":\"1\", # \u7528\u6237ID\n \"user_name\":\"Tom\" # \u7528\u6237\u540d\u79f0\n }\n \"\"\"\n\n\nclass UserApiView(RetrieveUpdateDestroyAPIView, generics.GenericAPIView):\n \"\"\"\n get:\n ### \u67e5\u8be2\u7528\u6237\u4fe1\u606f ###\n\n \u8bf7\u6c42\u53c2\u6570 id, \u7528\u6237id\n \u8fd4\u56de\n {\n \"id\":\"1\", # \u7528\u6237ID\n \"user_name\":\"Tom\" # \u7528\u6237\u540d\u79f0\n }\n delete:\n ### \u5220\u9664\u7528\u6237 ###\n\n \u8def\u5f84\u53c2\u6570\n id \u7528\u6237id\n \u8fd4\u56de\n 404 \u7528\u6237id\u4e0d\u5b58\u5728\n 204 \u5220\u9664\u6210\u529f\n \"\"\"\n\n def put(self, request, *args, **kwargs):\n \"\"\"\n ### \u8986\u76d6\u4fee\u6539\u7528\u6237 ###\n\n \u8bf7\u6c42\u53c2\u6570\n {\n \"id\":\"1\", # \u7528\u6237ID\n \"user_name\":\"Tom\" # \u7528\u6237\u540d\u79f0\n }\n \u8fd4\u56de 200 \u4fee\u6539\u6210\u529f\n \"\"\"\n return super(UserApiView, self).put(self, request, *args, **kwargs)\n\n\nclass CarViewSet(ModelViewSet):\n \"\"\"\n list: \u5206\u9875\u67e5\u8be2\u8f66\u8f86\n retrieve:\u83b7\u53d6\u8f66\u8f86\u4fe1\u606f\n update: \u8986\u76d6\u4fee\u6539\u8f66\u8f86\n partial_update: \u90e8\u5206\u4fee\u6539\u8f66\u8f86\n create: \u521b\u5efa\u8f66\u8f86\n destroy: \u5220\u9664\u8f66\u8f86\n \"\"\"\n```\n\n## service_configuration\n\n> \u63cf\u8ff0\uff1a consul \u670d\u52a1\u914d\u7f6e\u4e2d\u5fc3\n> sparrow_cloud \u9879\u76ee\u7684\u8bb8\u591a\u7ec4\u4ef6\u5bf9 consul\u670d\u52a1\u53d1\u73b0 \u6709\u91cd\u5ea6\u4f9d\u8d56, \u9700\u914d\u7f6e consul\n\n```\n# \u5728 settings\u91cc\u9762\u914d\u7f6e consul\u53c2\u6570\nCONSUL_CLIENT_ADDR = {\n \"HOST\": os.environ.get(\"CONSUL_IP\", \"127.0.0.1\"), # \u5728k8s\u4e0a\u7684\u73af\u5883\u53d8\u91cf\u7c7b\u578b\uff1a\u53d8\u91cf/\u53d8\u91cf\u5f15\u7528\n \"PORT\": os.environ.get(\"CONSUL_PORT\", 8500)\n}\n\n\u4f7f\u7528\u65b9\u6cd5\uff1a\nfrom sparrow_cloud.registry.service_configuration import config\n> value = config(key=\"foo\")\n\n\u53c2\u6570\u8bf4\u660e:\n key: consul\u914d\u7f6e\u4e2d\u5fc3\u7684key\n ps: \u4f18\u5148\u7ea7\u987a\u5e8f\uff1a consul --> settings\n consul\u4e2d\u4f18\u5148\u7ea7\u987a\u5e8f\n consul\u6b63\u5e38\uff1aconsul --> redis(30\u5185\u6709\u6548\u671f\u5185)\n consul\u5f02\u5e38\uff1a\u5982\u679c\u6570\u636e\u5b58\u5728 redis\uff0c \u76f4\u63a5\u8fd4\u56de \n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "sparrowcloud", "package_url": "https://pypi.org/project/sparrowcloud/", "platform": "", "project_url": "https://pypi.org/project/sparrowcloud/", "project_urls": null, "release_url": "https://pypi.org/project/sparrowcloud/1.3.3/", "requires_dist": [ "requests (>=2.12.1)", "python-consul (>=1.1.0)", "coreapi (>=2.3.3)", "PyJWT (>=1.7.1)", "openapi-codec (>=1.3.2)", "dulwich (>=0.19.13)", "sparrow-task-sender (>=0.0.3)", "sparrow-rabbitmq-consumer (>=0.0.8)" ], "requires_python": ">=3.5", "summary": "", "version": "1.3.3" }, "last_serial": 6005488, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "08eea95361c11efca36a1a8f7eefc872", "sha256": "7f92361764fba19a45f7f16e89ff0ca77abb3fbc015152e00074da41a6a22550" }, "downloads": -1, "filename": "sparrowcloud-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "08eea95361c11efca36a1a8f7eefc872", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 35129, "upload_time": "2019-09-03T11:25:49", "url": "https://files.pythonhosted.org/packages/60/83/0a2b11798fb22d86c4ac581a379509f664a2fa7db11c8140ea2093bd8d09/sparrowcloud-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6e27dbf0d8f03c094d0a44d96888ceb4", "sha256": "c6de4c44ca2830e34cdcd1e8dbbde505a03b94999f242630d81eb2bc46b32ef8" }, "downloads": -1, "filename": "sparrowcloud-1.0.0.tar.gz", "has_sig": false, "md5_digest": "6e27dbf0d8f03c094d0a44d96888ceb4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 23258, "upload_time": "2019-09-03T11:25:51", "url": "https://files.pythonhosted.org/packages/c0/6a/dd839229708f9b2a91e920809e4c3b01c87186d65f2d4da8041d5ad6dc48/sparrowcloud-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "c958957959a266f77ec26d483ad95ca4", "sha256": "55b697c823fae7e058c5ced7d5afcc226524c4a7b8695ed48c962e638661b26a" }, "downloads": -1, "filename": "sparrowcloud-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c958957959a266f77ec26d483ad95ca4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 35086, "upload_time": "2019-09-03T11:28:23", "url": "https://files.pythonhosted.org/packages/ae/6f/047da9276a62bc3a6361298ebfd53aaee3635ffdc87fa7a5e33dc92e06c2/sparrowcloud-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87ebabad54665ebe35bb07bcf187653f", "sha256": "e373adf68886091ef2adc868557b2ecf5d5b1d294286b68c371a8797804b939d" }, "downloads": -1, "filename": "sparrowcloud-1.0.1.tar.gz", "has_sig": false, "md5_digest": "87ebabad54665ebe35bb07bcf187653f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 23166, "upload_time": "2019-09-03T11:28:25", "url": "https://files.pythonhosted.org/packages/2e/78/a5d98bde68c35d6794a63ec6ad62253bc3a532716c6c7fcc7e3de7cc8862/sparrowcloud-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "5c819b18ba454b0a8ab27901bac3ed6e", "sha256": "bec38bad738c19954b9fed728f8afa277d7dd519050f913a9f214c1c1a27cf91" }, "downloads": -1, "filename": "sparrowcloud-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "5c819b18ba454b0a8ab27901bac3ed6e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 35121, "upload_time": "2019-09-03T11:42:11", "url": "https://files.pythonhosted.org/packages/5c/68/1d11ea172285ae5617f5dfc0fcd76711054985e3c287a4ccc5dc738ed675/sparrowcloud-1.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d31248af9254e039a5296366d11f1c91", "sha256": "63520e2a4ffba230da805ff8242731f2c4153cb5d16c55b506f6988a8314574d" }, "downloads": -1, "filename": "sparrowcloud-1.0.2.tar.gz", "has_sig": false, "md5_digest": "d31248af9254e039a5296366d11f1c91", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 23216, "upload_time": "2019-09-03T11:42:15", "url": "https://files.pythonhosted.org/packages/dc/74/b8f9403fdab4d89069b65061fe14c66949431c76964b6a4bbc3c9b0bacd7/sparrowcloud-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "b8e7f52d8673e53aa7f182a4cd8f92a9", "sha256": "e88c0bb4b040282b870b95a0a6ca3aaffbc68f1203d9aad83ef7f6a58cfa3ced" }, "downloads": -1, "filename": "sparrowcloud-1.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "b8e7f52d8673e53aa7f182a4cd8f92a9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 35219, "upload_time": "2019-09-03T13:00:04", "url": "https://files.pythonhosted.org/packages/20/80/860520e3bfeed93a637fe1a797e6a174c5f42b2845c5ef7a4d792ed05d79/sparrowcloud-1.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "23d56caa8ded2a460124ad68f105eb45", "sha256": "cddfec49bbe895747f2c6225dfb6123843417a67258eafbd94d70f44b8bc828b" }, "downloads": -1, "filename": "sparrowcloud-1.0.3.tar.gz", "has_sig": false, "md5_digest": "23d56caa8ded2a460124ad68f105eb45", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 23396, "upload_time": "2019-09-03T13:00:05", "url": "https://files.pythonhosted.org/packages/25/94/85698ae013bb16ea45e8c69df6eb8f1f7fd5854096fc0c660a216dacd99f/sparrowcloud-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "2be702dd69eda3a87a035b86e4f9e57c", "sha256": "547e0db3bb5b39f3a27511a5d5ce77dee5f4ca43b6c0df8ec40a9173a1d50316" }, "downloads": -1, "filename": "sparrowcloud-1.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "2be702dd69eda3a87a035b86e4f9e57c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 40656, "upload_time": "2019-09-06T03:55:34", "url": "https://files.pythonhosted.org/packages/51/eb/5275d72e65bea5e85e38c66cd0adb0f8b45db3e5ae69ae27ec965fd24645/sparrowcloud-1.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "227f14e06daa227a5a5eca985c65f2d5", "sha256": "f87492fd8ecbe82f417a3070dc5bd07bd43e88f4b1df2438689d5f845a5cced7" }, "downloads": -1, "filename": "sparrowcloud-1.0.4.tar.gz", "has_sig": false, "md5_digest": "227f14e06daa227a5a5eca985c65f2d5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 26632, "upload_time": "2019-09-06T03:55:36", "url": "https://files.pythonhosted.org/packages/56/e9/6fcab9dbb64fbae440283b62498e7958a305190d8ca50674a447a2b72f41/sparrowcloud-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "6a4b1b1d9d7a302911665b0563e4ac3f", "sha256": "fe49134920e92ebba1e37c3f2d544caa98bb2fe2d9caf3deb19e9a8fe9a8b523" }, "downloads": -1, "filename": "sparrowcloud-1.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "6a4b1b1d9d7a302911665b0563e4ac3f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 40817, "upload_time": "2019-09-10T08:49:51", "url": "https://files.pythonhosted.org/packages/20/e0/dffe6294820c9e8cdae54fec28a08dc1eee70598c7cabbaa886e4118ea21/sparrowcloud-1.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f95c7696a17008e3dcc2e9e2c2ebb028", "sha256": "83741cbdb7b5d6ffb075e8b7147e4ee60f31d601aebee827820af241c2d77f7c" }, "downloads": -1, "filename": "sparrowcloud-1.0.5.tar.gz", "has_sig": false, "md5_digest": "f95c7696a17008e3dcc2e9e2c2ebb028", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 27342, "upload_time": "2019-09-10T08:49:53", "url": "https://files.pythonhosted.org/packages/a1/71/28b3ee03094001bbefb54cb60797f25857c7d028f4b044d502214bbaf85c/sparrowcloud-1.0.5.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "894b2500a757eb6c82b226bdc9137644", "sha256": "399fe461f68c42b9b8520a426e21f078981896578fff1122d9fcc7a646e3dbae" }, "downloads": -1, "filename": "sparrowcloud-1.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "894b2500a757eb6c82b226bdc9137644", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 42911, "upload_time": "2019-09-11T03:52:14", "url": "https://files.pythonhosted.org/packages/b2/79/a5609b35abb103f0a632c8a7f5492524cfd51d2ec415831c820c78439efd/sparrowcloud-1.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c401d53e419fd1859486d7dd301a41d", "sha256": "accd11edd689d39f2e4da03a0248a04d4e4dc0b518b5cdc2f25ccdccd76c54a2" }, "downloads": -1, "filename": "sparrowcloud-1.0.6.tar.gz", "has_sig": false, "md5_digest": "5c401d53e419fd1859486d7dd301a41d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 28270, "upload_time": "2019-09-11T03:52:17", "url": "https://files.pythonhosted.org/packages/e9/e5/fba9590497cf809c2fa7702636b5cc3d8aa21171442e08cc0125cca0841d/sparrowcloud-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "e7dedc1d30c0f6a4d4266a721a23dd50", "sha256": "0a4647a3de9fc0fa4119dcc1682f2cab2d78d4fd821e3d070536b6de2f8cf803" }, "downloads": -1, "filename": "sparrowcloud-1.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "e7dedc1d30c0f6a4d4266a721a23dd50", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 44816, "upload_time": "2019-09-11T13:13:23", "url": "https://files.pythonhosted.org/packages/fe/39/6f83343518eaacf51bdbdb76e1908b78f1b6351bd1ff70e822c84a26068e/sparrowcloud-1.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d08167a262649443c92317fcd742bab4", "sha256": "f1c827f2e4704755b4a8cf542e0c30ee0e637ca4d3439f6d333e1c1d655053e1" }, "downloads": -1, "filename": "sparrowcloud-1.0.7.tar.gz", "has_sig": false, "md5_digest": "d08167a262649443c92317fcd742bab4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 28873, "upload_time": "2019-09-11T13:13:25", "url": "https://files.pythonhosted.org/packages/05/ec/1a50264c4b8f99b5256d2838fda60a9432d3f97ac54ec0eedee329c359bf/sparrowcloud-1.0.7.tar.gz" } ], "1.0.8": [ { "comment_text": "", "digests": { "md5": "75fe39eb68367cd2ebc524bba4562eb0", "sha256": "a160eb263b0cb2c0e87ad89c8f2cf7ce0d8290c55e790b7a00a8a2b5e70f51d0" }, "downloads": -1, "filename": "sparrowcloud-1.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "75fe39eb68367cd2ebc524bba4562eb0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 44875, "upload_time": "2019-09-12T10:21:21", "url": "https://files.pythonhosted.org/packages/fb/b1/e50995aa129b5d93983dce78e313c3edbec3af71228e9bd6c78018332b76/sparrowcloud-1.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "96dfec78ff3b1064945845c09b980d8e", "sha256": "b0b6c2de82ce1ad97a33aaa50d6b96ad4cca9e0a8e025a66349ccd7c41e39b91" }, "downloads": -1, "filename": "sparrowcloud-1.0.8.tar.gz", "has_sig": false, "md5_digest": "96dfec78ff3b1064945845c09b980d8e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 29001, "upload_time": "2019-09-12T10:21:24", "url": "https://files.pythonhosted.org/packages/fd/53/6c5e96c229c569436b25aa8398f6023e03c51cb8eb9bb00f4fd367898619/sparrowcloud-1.0.8.tar.gz" } ], "1.0.9": [ { "comment_text": "", "digests": { "md5": "d99c397bae237342dd7f739712240d45", "sha256": "38ce04311ddffbfa8e250768f48bea4c237920d7f67158fb978edfb1d0140665" }, "downloads": -1, "filename": "sparrowcloud-1.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "d99c397bae237342dd7f739712240d45", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 46198, "upload_time": "2019-09-17T10:16:25", "url": "https://files.pythonhosted.org/packages/30/42/2edfb1e11016f6ad7cf6d73d6aaec896a2c0f3f4372f0cf18ccfdf3d78a4/sparrowcloud-1.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "10fe87af7b81e4f1f639e03cd4984709", "sha256": "de14e6481191262ace770283847d6350a99e6161bf6eb101439a126fcace2ea1" }, "downloads": -1, "filename": "sparrowcloud-1.0.9.tar.gz", "has_sig": false, "md5_digest": "10fe87af7b81e4f1f639e03cd4984709", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 30401, "upload_time": "2019-09-17T10:16:28", "url": "https://files.pythonhosted.org/packages/42/18/49f026e2faf387538ff87ad0fe0a9465d29609209c18fa5f0bfe7bac5be3/sparrowcloud-1.0.9.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "faffdb9d912de25e7e978d24a379a0c7", "sha256": "7028733602585bb2d50e5e61421adfb8b471c1e35b18595da7837940fe4f0278" }, "downloads": -1, "filename": "sparrowcloud-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "faffdb9d912de25e7e978d24a379a0c7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 46215, "upload_time": "2019-09-18T06:17:22", "url": "https://files.pythonhosted.org/packages/a3/da/3fa081a2c119f10a0404f57ceb6b509804e748254c0b13d742919a38f3d3/sparrowcloud-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "05fd0164c7bb79dedc88246f4339d8d8", "sha256": "326d37447d13ebc91d1317a3da8139bcc8268e07a012e824829c6b0b4938b36f" }, "downloads": -1, "filename": "sparrowcloud-1.1.0.tar.gz", "has_sig": false, "md5_digest": "05fd0164c7bb79dedc88246f4339d8d8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 30462, "upload_time": "2019-09-18T06:17:24", "url": "https://files.pythonhosted.org/packages/60/d1/99cc115a9b139088c8c32aaeb733c9322bb690de2c5b65d1490575da383c/sparrowcloud-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "34eeaac9303b87abd4d9d3b5b32cbcba", "sha256": "26fe10a67a2650633d81e8df40883d2d81820a0b370c085dcd2484b8cd493380" }, "downloads": -1, "filename": "sparrowcloud-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "34eeaac9303b87abd4d9d3b5b32cbcba", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 46188, "upload_time": "2019-09-18T08:40:40", "url": "https://files.pythonhosted.org/packages/52/33/895d16e511d97ae27f356b6b251c1091a4473832ef2a4e38ff24c9916e91/sparrowcloud-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "79b8c2815b578006db7147f0eab6e445", "sha256": "bc928b2ec948f121da130d412a485605675181618aebfe4971ed94c8cc3e1dfe" }, "downloads": -1, "filename": "sparrowcloud-1.1.1.tar.gz", "has_sig": false, "md5_digest": "79b8c2815b578006db7147f0eab6e445", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 30433, "upload_time": "2019-09-18T08:40:43", "url": "https://files.pythonhosted.org/packages/d6/cf/3eb391b4e439e5716b9353b358dc220e96cecae0ab0546772f83cf6b43be/sparrowcloud-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "a537022bf15b2641890835bb764bc0c6", "sha256": "def0405f009becb0f992aee19b7f676a4b30e9893226957aa545f3e80f54d9b4" }, "downloads": -1, "filename": "sparrowcloud-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a537022bf15b2641890835bb764bc0c6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 46154, "upload_time": "2019-09-19T07:48:09", "url": "https://files.pythonhosted.org/packages/67/1b/541c9c9ab0cd96b25eac06f43771aa11d71ca489c151741a8ea2c72cd144/sparrowcloud-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f891bdb75ebb3176682b725635276684", "sha256": "6784c3e6f6c9cef4a489e9957c3b0a8ce0c5d3af39ffed7eeaec2ba4ba185cc7" }, "downloads": -1, "filename": "sparrowcloud-1.1.2.tar.gz", "has_sig": false, "md5_digest": "f891bdb75ebb3176682b725635276684", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 30407, "upload_time": "2019-09-19T07:48:12", "url": "https://files.pythonhosted.org/packages/31/82/5b747b3bf47cd6716a22e2a3beb5655454dc4ef5cf2f0b54001e33032746/sparrowcloud-1.1.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "59acbb1515a57f1d0f3215d0702129c2", "sha256": "2722f8f1c5188de41019fe8b5d736466a3c9deb7bb06f190d3f2f9b754dc480b" }, "downloads": -1, "filename": "sparrowcloud-1.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "59acbb1515a57f1d0f3215d0702129c2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 63552, "upload_time": "2019-10-12T06:19:33", "url": "https://files.pythonhosted.org/packages/9f/bc/9cdc773e1dd8477cadf98a84fdd69f777560eff95e610cd3dd8d7d1e4b81/sparrowcloud-1.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "58e402bceac788abd17ae585aa4d009b", "sha256": "fd79ca0b8c04581eb7f8c138f5547054b3ab1907cd919e66ce3251c6333b17cf" }, "downloads": -1, "filename": "sparrowcloud-1.2.3.tar.gz", "has_sig": false, "md5_digest": "58e402bceac788abd17ae585aa4d009b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 42424, "upload_time": "2019-10-12T06:19:35", "url": "https://files.pythonhosted.org/packages/9d/89/a6de373ea2e66465b5ffdeb105892fe5bd85ac2b3b42fe2401cb68538fee/sparrowcloud-1.2.3.tar.gz" } ], "1.3.3": [ { "comment_text": "", "digests": { "md5": "d9459a55507e9250f7cbacf85f0c3a9a", "sha256": "7bbd894495e8141685fb98c11ded945920e216f79143965fffa4eb1c08835b3d" }, "downloads": -1, "filename": "sparrowcloud-1.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "d9459a55507e9250f7cbacf85f0c3a9a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 65410, "upload_time": "2019-10-21T04:57:33", "url": "https://files.pythonhosted.org/packages/45/cf/3535d7d698ca63c3cf30a73e10473b8ada48acfd37d17833609d6d433768/sparrowcloud-1.3.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "930e9cf4b3e883835af1c146753b4c00", "sha256": "667d2721f1ad3457d4720f6246f302e6c3bb7575b88071769082773f13891bb3" }, "downloads": -1, "filename": "sparrowcloud-1.3.3.tar.gz", "has_sig": false, "md5_digest": "930e9cf4b3e883835af1c146753b4c00", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 44753, "upload_time": "2019-10-21T04:57:36", "url": "https://files.pythonhosted.org/packages/d1/0b/55ef1a27107a8e0e727b33007177d565a0ea2316e4d32cf0540c04ba3b51/sparrowcloud-1.3.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d9459a55507e9250f7cbacf85f0c3a9a", "sha256": "7bbd894495e8141685fb98c11ded945920e216f79143965fffa4eb1c08835b3d" }, "downloads": -1, "filename": "sparrowcloud-1.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "d9459a55507e9250f7cbacf85f0c3a9a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 65410, "upload_time": "2019-10-21T04:57:33", "url": "https://files.pythonhosted.org/packages/45/cf/3535d7d698ca63c3cf30a73e10473b8ada48acfd37d17833609d6d433768/sparrowcloud-1.3.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "930e9cf4b3e883835af1c146753b4c00", "sha256": "667d2721f1ad3457d4720f6246f302e6c3bb7575b88071769082773f13891bb3" }, "downloads": -1, "filename": "sparrowcloud-1.3.3.tar.gz", "has_sig": false, "md5_digest": "930e9cf4b3e883835af1c146753b4c00", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 44753, "upload_time": "2019-10-21T04:57:36", "url": "https://files.pythonhosted.org/packages/d1/0b/55ef1a27107a8e0e727b33007177d565a0ea2316e4d32cf0540c04ba3b51/sparrowcloud-1.3.3.tar.gz" } ] }