Django模型及Admin

发布时间 2023-10-08 14:31:33作者: 韩志超

Django简介

什么是Django

Django是一个开源的Python Web框架,由Django Software Foundation开发和维护。Django的目标是让Web开发更加快速、简单和高效,提供了许多内置的功能和库,如ORM、模板引擎、表单处理、认证、管理后台等。

image

1.2 Django的优点及特点

  • 高效快速:Django提供了许多内置的功能和库,可以快速构建复杂的Web应用程序。
  • 安全稳定:Django提供了许多安全性功能,如CSRF保护、XSS保护、SQL注入保护等,可以保证Web应用程序的安全性和稳定性。
  • 可扩展性:Django提供了许多可扩展的功能和库,如第三方插件、中间件、信号等,可以根据需要扩展和定制Web应用程序。
  • 易于维护:Django提供了许多内置的功能和库,可以减少代码量和重复工作,使得Web应用程序易于维护和升级。
  • 社区活跃:Django拥有庞大的社区和生态系统,提供了许多第三方插件和库,可以快速解决各种问题和需求。

Django的应用场景

  • 大型Web应用程序:Django适用于大型Web应用程序的开发,可以快速构建复杂的Web应用程序。
  • CMS系统:Django提供了许多内置的功能和库,如ORM、模板引擎、管理后台等,适用于CMS系统的开发。
  • 社交网络:Django提供了许多内置的功能和库,如认证、权限、信号等,适用于社交网络的开发。
  • 电子商务:Django提供了许多内置的功能和库,如ORM、表单处理、支付等,适用于电子商务的开发。

Django、Flask和FastAPI对比

  • Django:Django是一个全功能的Web框架,提供了许多内置的功能和库,如ORM、模板引擎、表单处理、认证、管理后台等。Django适用于大型Web应用程序的开发,可以快速构建复杂的Web应用程序。Django的缺点是相对于其他框架来说比较重量级,需要一定的学习成本。
  • Flask:Flask是一个轻量级的Web框架,提供了基本的功能和库,如路由、模板引擎、请求和响应处理等。Flask适用于小型Web应用程序的开发,可以快速构建简单的Web应用程序。Flask的优点是灵活性高,可以根据需要选择和集成各种库和插件。Flask的缺点是需要手动安装和配置各种库和插件,需要一定的技术水平。
  • FastAPI:FastAPI是一个异步高性能Web框架,提供了高性能和易用性的特点,支持异步编程和类型注解。FastAPI适用于需要高性能和高并发的Web应用程序的开发,可以快速构建高效的Web应用程序。FastAPI的优点是性能高、易用性好、文档丰富,支持异步编程和类型注解。FastAPI的缺点是相对于其他框架来说还比较新,生态系统和社区还不够完善。

Django安装和配置

Django安装、创建项目及App

安装Django

pip install django

创建项目

django-admin startproject myproject

创建App

cd myproject
python3 manage.py createapp myapp

注册App:修改myproject/settings.py, 在INSTALLED_APPS中添加myapp

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

启动开发服务器

python3 manage.py runserver

访问 http://127.0.0.1:8000/

image

Django项目结构介绍

myproject /
├── manage.py            # 命令行管理工具
├── myapp /               # 应用目录
│   ├── __init__.py
│   ├── admin.py        # 应用管理后台配置
│   ├── apps.py          # 应用配置
│   ├── migrations /  # 应用数据库迁移脚本目录
│   ├── models.py      # 应用数据库模型配置
│   ├── tests.py          # 应用测试脚本
│   └── views.py         # 应用接口编写
└── myproject /         # 项目目录
    ├── __init__.py
    ├── asgi.py              # 异步ASGI部署配置
    ├── settings.py        # 项目设置
    ├── urls.py               # 项目总接口路由
    └── wsgi.py             # WSGI部署配置

此外根据实际需要还可以在myapp中添加

  • url.py  # 应用子接口路由
  • static /   # 应用静态文件目录
  • templates /  # 应用模板目录
  • templatetags /  # 应用自定义模板标签目录

Django配置文件介绍

  • DEBUG:用于开启或关闭调试模式,调试模式下会显示详细的错误信息和调试信息。
  • ALLOWED_HOSTS:用于设置允许访问Django应用程序的主机名或IP地址。
  • DATABASES:用于配置数据库连接信息,包括数据库类型、主机名、端口号、用户密码等。
  • INSTALLED_APPS:用于配置Django应用程序中安装的应用程序列表。
  • MIDDLEWARE:用于配置Django应用程序中使用的中间件列表。
  • STATIC_URL:用于配置静态文件的URL前缀。
  • TEMPLATES:用于配置Django应用程序中使用的模板引擎和模板选项。
  • TIME_ZONE:用于配置时区信息,如Asia/Shanghai
  • LANGUAGE_CODE:用于配置语言代码,如zh-hans
  • STATICFILES_DIRS:用于配置静态文件的目录列表(默认无该项),如 STATICFILES_DIRS=[BASEDIR / 'static']

Django使用MySQL数据库

安装MySQL客户端
pip install mysqlclient
如果安装不上,可以换成pip install pymysql, 并在settings.py同级目录的__init__.py中添加

import pymysql
pymysql.install_as_MySQLdb()

•数据库配置
在settings.py中修改DATABASES配置

DATABASES = {
    'default': {
         'ENGINE': 'django.db.backends.mysql',
         'NAME': 'myproject',  # 需要手动创建库
         'USER': 'root',
         'PASSWORD': 'passw0rd',
         'HOST': 'localhost',
         'PORT': '3306'
    }
}

Django启用静态服务显示图片

安装pillow

pip install pillow

媒体配置,在settings.py中修改添加media相关配置

MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"

启用静态服务URL,在urls.py中修改添加media相关配置

from django.conf.urls.static import static

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Django编写接口

•编写视图函数
•编辑app/views.py,定义接口(视图)

from django.http import JsonResponse

def hello(request):
    data = { 'message': 'Hello, World!'}
    return JsonResponse(data)

注册接口路由
编辑myproject/urls.py,导入接口并关联接口地址

from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', views.hello, name='hello'),
]

浏览器访问 http://127.0.0.1:8000/hello/  查看效果。

获取接口参数

获取GET请求Query参数

def hello(request):
    msg = request.GET.get(‘msg’)
    # ...

获取POST请求JSON数据

def hello(request):
    data = json.loads(request.body)
    msg = data.get(‘msg’)
    # ...

获取POST请求FORM参数

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt  # 需要关闭csrf token验证
def hello(request):
    msg = request.POST.get(‘msg’)
    # ...

获取接口路径参数
url配置中添加参数

# myproject/url.py
...
urlpatterns = [
    path('hello/<msg>', views.hello, name='hello'),
]

接口函数中添加对应参数

# myapp/views.py
def hello(request, msg):
    # ...

返回不同的响应

返回普通HTTP响应

from django.http import HttpResponse

def hello(request):
    html = '<h1>Hello, world!</h1>'
    return HttpResponse(html) #支持指定状态码及内容类型

返回JSON响应

from django.http import JsonResponse

def hello(request):
    data = {'message': 'Hello, World!'}
    return JsonResponse(data)

重定向到其他接口

from django.http import HttpResponseRedirect

def hello(request):
    return HttpResponseRedirect('/hi')

渲染并返回HTML模板

{#myapp/templates/hello.html#}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
    <h1>{{ message }}</h1>
</body>
</html>
# myapp/views.py
from django.shortcuts import render

def hello(request):
    data = {'message': 'Hello, World!'}
    return render(request, 'hello.html', data)

返回文件

import os
from django.http import FileResponse
from django.conf import settings

def hello(request):
    file_path = os.path.join(settings.MEDIA_ROOT, ‘my_file.txt’)
    return FileResponse(open(file_path, ‘rb’), as_attachment=True)   # 不加as_attachment=True则返回文件原始内容

返回错误常见HTTP错误

from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound, HttpResponseServerError

def hello(request):
    # return HttpResponse('400 Bad request', status=400)
    # return HttpResponseBadRequest('400 Bad request')
    # return HttpResponseBadRequest('404 Not found')
    return HttpResponseBadRequest('500 Internal Server Error')

Django路由配置

在Django中,路由配置用于将URL映射到相应的视图函数或类。通过路由配置,可以定义应用程序中的URL模式,以便Django能够正确地将请求路由到相应的处理程序。

  • path
  • re_path
  • include
    路由名称及反向查找
  • reverse()
  • redirect()