Python社区偶像级大师KennethReitz“三件套”安装命令
优采云 发布时间: 2021-08-02 00:37Python社区偶像级大师KennethReitz“三件套”安装命令
Django 是 Python 社区中最受欢迎的 Web 框架之一。 Django以其高度抽象的组件和强大便捷的脚手架,将快速流畅的开发体验诠释到了极致。作为从Vue.js进化而来的前端框架,Nuxt可以轻松开发复杂的SPA(Single Page Application)。两人相遇,又会产生怎样的火花?本教程将使用 Django + Nuxt 实现一个具有完整 CRUD 功能的全栈应用。最后,郑重警告:请勿深夜阅读本教程! ! !
本文涉及的源码全部在Github上。如果你觉得我们写的不错,希望你能给这个文章点赞+Github repo ❤️~本文代码改编自Scotch。
项目初始化
在本系列教程中,我们将实现一个全栈美食分享网站,后端使用Django实现,前端使用Nuxt框架。以下是最终的项目效果:
预备知识
本教程假设您已经知道
学习目标
完成本教程后,您将:
使用pipenv初始化Python环境
首先创建项目目录并输入:
$ mkdir recipes_app && cd recipes_app
在这个项目中,我们使用 pipenv 来管理 Python 项目的环境依赖。 Pipenv 是由 Python 社区的标志性大师 Kenneth Reitz 领导的开发过程优化工具。决心整合所有项目管理工具(Node的npm、Ruby的bundler、PHP的composer等)的优点。我们通过如下命令安装pipenv并为项目创建一个依赖环境:
$ pip install pipenv
$ pipenv shell
如果在命令提示符前面看到提示(recipes_app-nV3wuGJ1))(后面的随机字符串可能不同),就说明我们已经成功为项目创建了独一无二的虚拟环境!来安装Django“三件套”:
安装命令如下:
(recipes_app-nV3wuGJ1) $ pipenv install django django-rest-framework django-cors-headers
此时pipenv产生了Pipfile文件,与Node项目中的package.json文件类似:
[[source]]
url = "https://mirrors.aliyun.com/pypi/simple/"
verify_ssl = true
name = "pypi"
[packages]
django = "*"
django-rest-framework = "*"
django-cors-headers = "*"
[dev-packages]
[requires]
python_version = "3.6"
然后使用Django脚手架创建服务端项目api的基本结构,进入api创建子应用核心:
(recipes_app-nV3wuGJ1) $ django-admin startproject api
(recipes_app-nV3wuGJ1) $ cd api
(recipes_app-nV3wuGJ1) $ python manage.py startapp core
接下来进行数据库迁移,创建超级用户登录后台管理:
(recipes_app-nV3wuGJ1) $ python manage.py migrate
(recipes_app-nV3wuGJ1) $ python manage.py createsuperuser
按照问题并输入信息。记住用户名和密码!然后运行开发服务器:
(recipes_app-nV3wuGJ1) $ python manage.py runserver
访问localhost:8000/admin,可以看到后台管理的登录页面。输入刚刚创建的超级用户的用户名和密码,就会进入后台管理系统,如下图:
熟悉的界面,但一无所有,而且都是英文的!别着急,后面我们会一一处理。
使用 Django 实现 REST API
接下来,我们将实现该项目所需的所有 API。是的,你没听错,这一步我们会实现所有的后端接口,10分钟左右就可以搞定!这是 Django 的宣言:
适用于有截止日期的完美主义者的网络框架。
“为匆忙的完美主义者而生!”
全局配置
首先在全局配置文件settings.py中做如下修改:
将 rest_framework、corsheaders 和核心添加到 INSTALLED_APPS。前两个是Django Rest Framework和Django CORS Headers的应用,最后一个是我们的网站应用;将 corsheaders.middleware.CorsMiddleware 添加到 MIDDLEWARE 并注册跨域请求中间件(注意一定要先放!);设置CORS_ORIGIN_WHITELIST,添加跨域请求白名单,这里写:3000,开发前端时会用到;设置LANGUAGE_CODE为zh-hans,可以设置后台管理设置为中文,非常方便; MEDIA_URL 和 MEDIA_ROOT 设置为在开发期间提供对图像资源文件的访问。
具体代码如下:
# ...
INSTALLED_APPS = [
# 默认的 App ...
'rest_framework',
'corsheaders',
'core',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
# 默认的中间件 ...
]
CORS_ORIGIN_WHITELIST = (
'http://localhost:3000',
)
# ...
LANGUAGE_CODE = 'zh-hans'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
实现核心应用
下一步是实现核心 Django 应用程序。一个Django应用的实现一般是这样的:
定义数据模型(models.py),用于实现与数据库的绑定;定义后台管理配置(admin.py),用于在后台管理系统中操作;定义序列化器(serializers.py),仅在实现REST API时需要,用于提供数据模型(或其他数据交换格式)的JSON序列化;定义视图(views.py)来实现特定的业务逻辑;定义路由(urls.py)),用于定义路由规则并映射到相应的视图;将应用路由连接到全局路由文件(api/urls.py)。
我们从第一步开始并完成食谱。菜谱的数据模型如下:
from django.db import models
class Recipe(models.Model):
DIFFICULTY_LEVELS = (
('Easy', '容易'),
('Medium', '中等'),
('Hard', '困难'),
)
name = models.CharField(max_length=120, verbose_name='名称')
ingredients = models.CharField(max_length=400, verbose_name='食材')
picture = models.FileField(verbose_name='图片')
difficulty = models.CharField(choices=DIFFICULTY_LEVELS, max_length=10,
verbose_name='制作难度')
prep_time = models.PositiveIntegerField(verbose_name='准备时间')
prep_guide = models.TextField(verbose_name='制作指南')
class Meta:
verbose_name = '食谱'
verbose_name_plural = '食谱'
def __str__(self):
return '{} 的食谱'.format(self.name)
其中,类Meta定义了Recipe的元数据; __str__ 方法定义了在将配方对象转换为字符串时应如何显示它。打开后台管理系统后,这些设置的作用就一目了然了。详细了解Django数据模型,请参考相关中文文档。
第二步是为核心子应用配置相应的后台管理功能。很简单,注册定义的Recipe模型即可:
from django.contrib import admin
from .models import Recipe
# Register your models here.
admin.site.register(Recipe)
第三步定义serializer serializers.py(脚手架不会自动创建,需要手动创建)。序列化器是 Django Rest Framework 提供的一个功能,可以方便地将 Django 数据模型序列化为对应的 JSON 数据格式。这里,我们定义了一个RecipeSerializer,并将Meta中对应的数据模型指定为刚刚创建的Recipe,并选择对应的字段显示:
from rest_framework import serializers
from .models import Recipe
class RecipeSerializer(serializers.ModelSerializer):
class Meta:
model = Recipe
fields = (
'id', 'name', 'ingredients', 'picture',
'difficulty', 'prep_time', 'prep_guide'
)
第四步是实现视图。这里我们使用open模式,直接调用Django Rest Framework提供的ModelViewset,直接修复数据模型的增删改查逻辑:
from rest_framework import viewsets
from .serializers import RecipeSerializer
from .models import Recipe
class RecipeViewSet(viewsets.ModelViewSet):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
只需指定serializer_class(序列化器类)和queryset(模型查询集),自动定义模型增删查改!虽然视图集很强大,但是如果想要实现更灵活的业务逻辑,还是要为每个接口定义一个单独的视图类。
第五步是实现路由。由于我们使用了上一步中设置的视图,所以只需要调用DefaultRouter自动生成相关路由,然后添加到记录路由映射的urlpatterns列表中即可:
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import RecipeViewSet
router = DefaultRouter()
router.register(r'recipes', RecipeViewSet)
urlpatterns = [
path('', include(router.urls)),
]
路由器会自动为我们生成以下路由:
注意
HTTP 方法未收录在 Django 路由定义中。具体的HTTP方法可以在视图中读取判断。
最后一步是将核心子应用中的路由连接到全局路由:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('core.urls')),
]
是的,我们都实现了用于添加、删除、修改和检查食谱的 API!不相信?先运行开发服务器:
(recipes_app-nV3wuGJ1) $ python manage.py runserver
由于 Django REST Framework 为我们提供了用于测试 API 的 Web 界面,因此我们不需要 Postman 之类的工具来进行测试。用浏览器访问localhost:8000/api/recipes,会进入API测试页面,如下图:
这个页面底部还有一个添加数据的表单(发起POST请求),我们填写一些数据,然后点击POST按钮:
然后再次访问食谱列表页面,有我们刚刚添加的食谱!另外也可以尝试访问单个recipe的详情页(例如localhost:8000/api/recipes/1),可以直接通过网页修改或删除!