加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

Django让web开发更简单(一):运行MVT设计模式

10/04 11:25
550
阅读需 27 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

创建工程

开始本章之前,大家可以先看看我的另一篇文章:Django基本流程

1、这里使用pycharm专业版进行django开发,该开发工具确实很强大,爱不释手。

2、创建工程:

在这里插入图片描述

如图是创建好的工程,创建方式,如图演示。

创建工程还可以通过django-admin命令进行,该命令解释如下:

django-admin --help

在这里插入图片描述

在使用这个命令的时候,有一个奇怪现象:

(1)直接运行时:

在这里插入图片描述

这条记录为:
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but s
ettings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before
accessing settings.).

(2)缩放窗口后:

在这里插入图片描述

变成了两条记录!内容为:
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not conf Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before
accessing settings.).

经过福尔摩斯本人的调查,上面是pycharm的一个bug,看似两条记录,经过对比,实际想说的事情,跟第一条是一样的,所以这本质上是一条记录。(我在测试方面,有时候觉得自己是个天才!!!)

我向来是追求完美的,不允许出现任何瑕疵,这个是pycharm本身的问题,我不处理了,但是抛出的这个Note,我得处理一下:

在settings文件里面,我又发现一个奇怪的问题:

“”"
Django settings for mylovedjango project.

Generated by ‘django-admin startproject’ using Django 3.1.

For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
“”"

创建使用了django,但文件本身有问题:

在这里插入图片描述

所以需要手动导入os模块,并修改格式,使其能用,而且美观。通过上面两个小插曲,感觉这个django有点不靠谱。按理说django团队,不应该这样“马大哈”呀!难道我下了一个假的django!不管了,先解决这个问题:

Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but s
ettings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before
accessing settings.).

查询官方文档了解情况:

https://docs.djangoproject.com/en/3.1/ref/django-admin/

在这里插入图片描述

主要意思为:如果通过pip安装Django,那么Django管理脚本应该位于系统路径上。如果不在您的路径中,请确保您已经激活了虚拟环境。

我也不确定是否用pip安装了Django,但激活虚拟环境,应该就可以解决该问题。好像不激活环境也能用,这里应该是提示你这个主意事项,后续遇到问题可以通过激活的方式解决。既然不影响,我当然选择,忽略该问题啦!小问题,不值得我出手,哈哈!不过,win10激活环境的方式如下:

在这里插入图片描述

运行工程环境下的activate.bat就可以激活(pycharm创建环境时,应该已经自动激活)。

创建应用

在这里插入图片描述

如上,使用命令行工具创建应用,创建成功,命令如下:

django-admin startapp firstapp

1、注册应用
工程目录下的settings文件,在INSTALLED_APPS列表中添加’firstapp.apps.FirstappConfig’,:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'firstapp.apps.FirstappConfig',
]

如上,即可完成应用的注册。注册的目的,是说明该应用是合法的,至少在django的“应用商店”是合法的。

模型

每个应用都有一个模型文件models.py,用于定义数据字段。

# 查看官方文档并进行配置:
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': BASE_DIR / 'db.sqlite3',
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangostudy',
        'USER': 'root',
        'PASSWORD': 'yeqinfang',
        'HOST': '192.168.31.201',
        'PORT': '3306',
    }
}

运行之后报错:

python manage.py runserver

在这里插入图片描述根据提示,安装该客户端

官方文档: https://pypi.org/project/mysqlclient/

pip install mysqlclient

在这里插入图片描述

运行之后即可连上数据库(django自动导入了mysqlclient模块):

在这里插入图片描述

根据提示,要使得django工作,得进行migrations:

python manage.py makemigrations
python manage.py migrate

在这里插入图片描述运行之后:

在这里插入图片描述
如上,运行成功,说明替换mysql数据库成功,生成表如下:

在这里插入图片描述

如上,表的名称默认应用名称加上类的名称。

视图

我们已经有了数据,那么这些数据如何展示出来呢?django是一个后台,后台的数据可以通过接口提供。所以,视图就是用于接口的编写的,包含了一些业务逻辑。

现在表里面没有数据,我们在views.py里写一些接口进行操作:

1、增

该接口用于新增数据。

from django.shortcuts import render
from django.http import JsonResponse
import json
from firstapp.models import testmysql

# Create your views here.

def add_data(request):
    response = {}  # 响应
    if request.method == "POST":
        req = json.loads(request.body)
    else:
        response["msg"] = "请求方法错误"
        response["code"] = 400
        return JsonResponse(response)
    # 数据持久化(往数据库写入数据)
    try:
        data = testmysql()
        data.student_name = req["studentName"]
        data.course_name = req["courseName"]
        data.save()
        response['msg'] = 'success'
        response['error_num'] = 0
    except  Exception as e:
        response['msg'] = str(e)
        response['error_num'] = 1
    return JsonResponse(response)


如上是一个新增接口,设置好后,需要配置路由,否者请求不到改接口:

路由配置有三种方式,在urls模块里面有提示:

“”"mylovedjango URL Configuration

The urlpatterns list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/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’))
“”"

我们这里采用第三种方式,在应用里新增一个子路由(复制粘贴urls到应用里),并进行设置:

from django.urls import path
from firstapp.views import add_data

urlpatterns = [
    path('firstapp/', add_data),
]

如上,导入接口add_data,然后配置路由,让外部请求。

接着配置工程目录的主路由:

from django.urls import path, include


urlpatterns = [
    # path('admin/', admin.site.urls),
    path('', include('firstapp.urls')),
]

在这里插入图片描述
接着,运行程序,并通过postman进行模拟请求:

在这里插入图片描述
如图报错,查看后台日志为:

在这里插入图片描述
Forbidden (CSRF cookie not set.): /firstapp/

如上,报错的原因是,我们配置了cookies的验证,现在我们在设置文件里,把该选项注释掉:

在这里插入图片描述注释掉后自动加载,再次请求看看:

在这里插入图片描述在这里插入图片描述

如上,请求成功,数据写入数据库,至此,完成了新增数据接口。

2、查

有了数据之后,我们写个查询接口,专门查询数据:

def query_data(request, pk):
    response = {}  # 响应
    if request.method == "GET":
        query_art = testmysql.objects.all()
        for art in query_art:
            if art.id == pk:
                response["data"] = json.dumps({"id":art.id,
                                               "studentName":art.student_name,
                                               "courseName":art.course_name})
                response["msg"] = "查询成功"
                response["code"] = 200
            else:
                response["msg"] = "没有符合的数据"
                response["code"] = 201
                return JsonResponse(response)
    else:
        response["msg"] = "请求方法错误"
        response["code"] = 400
        return JsonResponse(response)
    # 查询数据
    return JsonResponse(response)

如上,采用GET方法,传入一个pk进行查询,应用的子路由配置如下:

urlpatterns = [
    path('firstapp/', add_data),
    path('firstapp/<int:pk>/', query_data),
]

验证结果:

在这里插入图片描述
如上,查询成功。不过,后台日志有个301的code:

在这里插入图片描述
301是重定向,表示当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。

这个应该是django的内部机制,暂时忽略。

3、改

现在我们写一个接口,用于更改数据库存在的信息:

def update_data(request, pk):
    response = {}  # 响应
    if request.method == "PUT":
        req = json.loads(request.body)
        try:
            art = testmysql.objects.get(id=pk)
            art.student_name = req["studentName"]
            art.course_name = req["courseName"]
            art.save()
            response["msg"] = "更新成功"
            response["code"] = 200
            return JsonResponse(response)
        except:
            response["msg"] = "数据不正确"
            response["code"] = 401
            return JsonResponse(response)
    else:
        response["msg"] = "请求方法错误"
        response["code"] = 400
        return JsonResponse(response)

子路由如下:

urlpatterns = [
    path('firstapp/', add_data),
    path('firstapp/<int:pk>/', query_data),
    path('firstapp/update/<int:pk>/', update_data),
]

运行之后报错:

在这里插入图片描述
在这里插入图片描述
查看后台,发现是django默认配置导致的。这里说的是路由请求的路径存在问题,解决的办法应该有3种:
1、修改子路由
2、请求的时候完全匹配路径
3、修改django配置

这里采用第二种:
在这里插入图片描述在这里插入图片描述

如上,请求成功。

4、删

定义一个删除接口,用于删除数据。

在views.py文件定义一个删除接口:

def delete_data(request, pk):
    response = {}
    if request.method == "DELETE":
        try:
            art = testmysql.objects.get(id=pk)
            art.delete()
            response["msg"] = "删除成功"
            response["code"] = 200
            return JsonResponse(response)
        except:
            return JsonResponse({"code": "500", "msg": "删除失败"})

添加子路由:

urlpatterns = [
    path('firstapp/', add_data),
    path('firstapp/<int:pk>/', query_data),
    path('firstapp/update/<int:pk>/', update_data),
    path('firstapp/delete/<int:pk>/', delete_data),
]

在这里插入图片描述
在这里插入图片描述
如上,数据已被删除。

模板

该模块定义了前端的展示界面,创建django工程时,专门生成了一个文件夹,这里放的就是前端代码。

在这里插入图片描述
当然,django有自带的模板语法,即HTML代码+python语言。

现在,我们编写Template将数据库的字段进行展示。

当我们使用了Template,就不再是前后端分离模型了,而是django的MVT模型,views视图返回的,不再是json格式数据,而是html页面。

1、修改query_data,需要使用render返回页面

def query_data(request, pk):
    response = {}  # 响应
    if request.method == "GET":
        query_art = testmysql.objects.all()
        for art in query_art:
            if art.id == pk:
                response["data"] = json.dumps({"id":art.id,
                                               "studentName":art.student_name,
                                               "courseName":art.course_name})
                response["msg"] = "查询成功"
                response["code"] = 200
            else:
                response["msg"] = "没有符合的数据"
                response["code"] = 201
                # return JsonResponse(response)
                return render(request, "firstappweb.html", response)
    else:
        response["msg"] = "请求方法错误"
        response["code"] = 400
        # return JsonResponse(response)
        return render(request, "firstappweb.html", response)
    # 查询数据
    # return JsonResponse(response)
    return render(request, "firstappweb.html", response)

2、如上,返回的firstappweb.html放在templates文件夹下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>data for test</title>
</head>
<body>
    <h1>{{ msg }}</h1>
    <h1>{{ code }}</h1>
    <h1>{{ data }}</h1>
</body>
</html>

在这里插入图片描述
在这里插入图片描述
输入地址访问:

在这里插入图片描述
如上,数据通过Templates显示在了页面上。

这就是django的MVT模型。

使用体验

通过上面的操作,我们发现django在web开发上,确实很简单!java目前是主流的web开发语言,而django也很难取代他的霸主地位。不过,豆瓣便是django的成功案例。所以,虽然django前途不太乐观,但也是可以让你快速成功的框架。

Django让web开发更简单!

相关推荐

电子产业图谱