Python社区偶像级大师KennethReitz“三件套”安装命令

优采云 发布时间: 2021-08-02 01:01

  

Python社区偶像级大师KennethReitz“三件套”安装命令

  

  Django 是 Python 社区中最受欢迎的 Web 框架之一。 Django以其高度抽象的组件和强大便捷的脚手架,将快速流畅的开发体验诠释到了极致。作为从Vue.js进化而来的前端框架,Nuxt可以轻松开发复杂的SPA(Single Page Application)。两人相遇,又会产生怎样的火花?本教程将使用 Django + Nuxt 实现一个具有完整 CRUD 功能的全栈应用。最后,郑重警告:请勿深夜阅读本教程! ! !

  本文涉及的源码全部在Github[1]上。如果你觉得我们写的不错,希望你能给这个文章点个在看+Github仓库star❤️~本文代码改编自Scotch[2]。

  项目初始化

  在本系列教程中,我们将实现一个全栈美食分享网站,后端使用Django实现,前端使用Nuxt框架。以下是最终的项目效果:

  

  预备知识

  本教程假设您已经知道

  学习目标

  完成本教程后,您将:

  使用pipenv初始化Python环境

  首先创建项目目录并输入:

  $ mkdir recipes_app && cd recipes_app

  在这个项目中,我们使用 pipenv[5] 来管理 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

  访问:8000/admin[7],可以看到后台管理的登录页面。输入刚刚创建的超级用户的用户名和密码,就会进入后台管理系统,如下图:

  

  熟悉的界面,但一无所有,而且都是英文的!别着急,后面我们会一一处理。

  使用 Django 实现 REST API

  接下来,我们将实现该项目所需的所有 API。是的,你没听错,这一步我们会实现所有的后端接口,10分钟左右就可以搞定!这是 Django 的宣言:

  适用于有截止日期的完美主义者的网络框架。

  “为匆忙的完美主义者而生!”

  全局配置

  首先在全局配置文件settings.py中做如下修改:

  将 rest_framework、corsheaders 和核心添加到 INSTALLED_APPS。前两个是Django Rest Framework和Django CORS Headers的应用,最后一个是我们的网站应用;

  在MIDDLEWARE中添加corsheaders.middleware.CorsMiddleware并注册跨域请求中间件(注意一定要放在第一位!);

  设置 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数据模型,请参考相关中文文档[8]。

  第二步是为核心子应用配置相应的后台管理功能。很简单,注册定义的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[9],进入API测试页面如下图:

  

  这个页面底部还有一个添加数据的表单(发起POST请求),我们填写一些数据,然后点击POST按钮:

  

  然后再次访问食谱列表页面,有我们刚刚添加的食谱!另外也可以尝试访问单个recipe的详情页(例如localhost:8000/api/recipes/1[10]),直接通过网页修改或删除即可!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线