Django后端
安装准备
requirements
- django>=3.0.3
- django-cors-headers>=3.2.1
- djangorestframework>=3.11.0
- mongoengine>=0.20.0
- pymongo>=3.9.0
创建项目
使用pycharm创建
命令行创建应用程序,命名为api
python manage.py startapp api
目录结构
MovieRatings #应用目录
│─ admin.py #对应应用后台管理配置文件。
│─ apps.py #对应应用的配置文件。
│─ models.py #数据模块,数据库设计就在此文件中设计。后面重点讲解
│─ tests.py #自动化测试模块,可在里面编写测试脚本自动化测试
│─ views.py #视图文件,用来执行响应代码的。你在浏览器所见所得都是它处理的。
配置
跨域冲突
安装好django-cors-headers之后
修改settings.py
ALLOWED_HOSTS
= ['*']
INSTALLED_APPS
= [
….
'corsheaders',
….]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = ()
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
MongoDB
建议使用mongodbengine,而非pymongo。
首先去掉Django默认的数据库Sqlite,同样是settings.py
DATABASES = {
'default': {
'ENGINE': None,
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
models.py代码
from django.db import models
from mongoengine import *
import json
with open('api/setting.json') as f:
setting = json.load(f)
connect('movie', host=setting['host'], username=setting['username'], password=setting['password'])
# Create your models here.
class Profile(Document):
name = StringField()
rate = StringField()
cover = StringField()
source = StringField()
url = StringField()
casts = ListField(StringField())
directors = ListField(StringField())
id = StringField()
type = ListField(StringField())
time = StringField()
rate_num = StringField()
_id = ObjectIdField()
这里settings.json存放数据库账号密码
api
url
url.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url
from django.views.generic.base import TemplateView
from django.http import HttpResponse
import api.views as views
urlpatterns = [
path('admin/', admin.site.urls),
url('api/search', view=views.search),
url('api/fusion', view=views.search_fusion),
]
view=views.search
是直接传入了方法入口,当然可以写一个类,再传它的方法,不过这里使用RESTful API就不需要这么麻烦了。
RESTful API
安装好djangorestframework
view.py
import json
from .models import Profile, Fusion
from django.http import JsonResponse
from rest_framework.decorators import api_view
from mongoengine.queryset.visitor import Q
@api_view(['GET'])
def search(request):
limit = 10 # max_num per page
params = request.GET.dict()
filters = {}
if 'limit' in params:
limit = int(params['limit'])
limit = max(30, limit)
if params.get('name'):
filters['name__contains'] = params['name']
for key in ['type', 'source', 'casts', 'directors']:
if params.get(key):
filters[key] = params[key]
if params.get("time_min"):
filters['time__gt'] = str(max(int(params['time_min']), 0))
if params.get("time_max"):
filters['time__lt'] = str(int(params['time_max']) + 1)
if 'rate_min' in params:
filters['rate__gte'] = params['rate_min']
if 'rate_max' in params and params['rate_max'] != "10":
filters['rate__lte'] = params['rate_max']
offset = int(request.GET.get('offset', 0))
movies = Profile.objects.exclude('_id').filter(**filters)
total = movies.count()
if 'order' in params:
movies = movies.order_by(params['order'])
movies = movies.limit(limit).skip(offset)
return JsonResponse({'data': json.loads(movies.to_json()), 'total': total}, json_dumps_params={'ensure_ascii': False})
@api_view(['GET'])
注解规定该方法仅在GET方式下作用
mongoengine使用方法参考
Mongoengine查询
MongoEngine文档—高级用法