DJangoAPI接口配置
郝伟 2021/02/05
为了让项目提供统一的API接口,本文章介绍了基于Django(发音类似于“江狗”)的解决方案。先看下演示程序。
演示地址
http://121.199.10.158:8200/
http://121.199.10.158:8200/webapi/question/
http://121.199.10.158:8200/webapi/question/2537
http://121.199.10.158:8200/webapi/question/2537/vote
http://121.199.10.158:8200/webapi/question/2537/results
http://121.199.10.158:8200/api/node/query/Worker/kvs:name=Jack
http://121.199.10.158:8200/api/node/query/Worker/kvs:name=Jack&stu_id=int:2
http://121.199.10.158:8200/api/node/query/人/kvs:性别=男/10,1
python3 manage.py runserver 0.0.0.0:8200 1>>log.txt 2>>error.txt &
使用命令 django-admin.py startproject HelloWorld,会生成目录 HelloWorld,结构如下:
注:如果Django环境配置好以后,可以在任意位置使用此命令。
HelloWorld/ ├── HelloWorld │ ├── asgi.py │ ├── __init__.py │ ├── settings.py # 参数配置 │ ├── urls.py # 路由规则 │ ├── views.py # 视图 │ └── wsgi.py └── manage.py
内容说明:
如上所述只要使用python3 manage.py runserver 0.0.0.0:8200 1>>log.txt 2>>error.txt &即可启动程序。
from django.http import HttpResponse#, render #from django.shortcuts import get_object_or_404, render def hello(request): return HttpResponse('hello') def tojson(request, question_id): #return render(request, 'index.html', {'question': question_id}) res = '''{ "name": "question", "id": %s }''' return HttpResponse(res % question_id) def results(request, question_id): data = '这里的问题 %s 的结果。<br>' % question_id data += '编号:%s <br>' % question_id data += '结果:略<br>' data += '<a href="http://121.199.10.158:8200/webapi/question/%s">返回<a/>' % question_id return HttpResponse(data) def results1(request, question_id, params): data = '问题编号:%s <br>' % question_id data += '所有参数: %s <br><br>' % params data += '----参数列表----<br>' for item in params.split('&'): if len(item) < 2 or item.count('=') != 1: data += '参数对: %s 的格式有误。<br>' % item else: data += '参数对: %s <br>' % item data += '<br><a href="http://121.199.10.158:8200/webapi/question/%s">返回<a/>' % question_id return HttpResponse(data) def vote(request, question_id): data = '''你已经为问题 %qid 完成投票。<br> <a href="http://121.199.10.158:8200/webapi/question/%qid">返回<a/>''' return HttpResponse(data.replace("%qid", str(question_id))) def info(request, question_id): html_data='''<html> <body> Information of Question %qid<br> <a href="http://121.199.10.158:8200/webapi/question/%qid">本页地址<a/><br> <ul> <li><a href="http://121.199.10.158:8200/webapi/question/%qid/results">myweb/webapi/question/%qid/results<a/><br></li> <li><a href="http://121.199.10.158:8200/webapi/question/%qid/results-k1=v1&k2=v2">myweb/webapi/question/%qid/results-k1=v1&k2=v2<a/><br></li> <li><a href="http://121.199.10.158:8200/webapi/question/%qid/vote">myweb/webapi/question/%qid/vote<a/><br></li> <li><a href="http://121.199.10.158:8200/webapi/question/%qid/tojson">myweb/webapi/question/%qid/tojson<a/><br></li> </ul> </body> </html> ''' return HttpResponse(html_data.replace('%qid', str(question_id)))
""" webapi/question URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/dev/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path #from django.urls import url from . import views urlpatterns = [ path('admin/', admin.site.urls), path('webapi/question/', views.hello), path('webapi/question/<int:question_id>/', views.info), path('webapi/question/<int:question_id>/results/', views.results, name='results'), path('webapi/question/<int:question_id>/results-<str:params>/', views.results1, name='results1'), path('webapi/question/<int:question_id>/tojson/', views.tojson, name='tojson'), path('webapi/question/<int:question_id>/vote/', views.vote, name='vote') ]
以下是参数配置内容,其中 ALLOWED_HOSTS 必需配置外部才可以访问。
""" Django settings for HelloWorld project. Generated by 'django-admin startproject' using Django 3.2a1. For more information on this file, see https://docs.djangoproject.com/en/dev/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/dev/ref/settings/ """ from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/dev/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-hf=m&v6^8ff%kf@6qt#(4g96%q=x-9&8$zrx6z2b@6o@*s54bn' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = ['121.199.10.158'] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'HelloWorld.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'HelloWorld.wsgi.application' # Database # https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } # Password validation # https://docs.djangoproject.com/en/dev/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/dev/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/dev/howto/static-files/ STATIC_URL = '/static/' # Default primary key field type # https://docs.djangoproject.com/en/dev/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'