【创新实训】后端开发笔记

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文档—高级用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值