1、Django 简介
1.1、基本介绍
Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。
使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。
1.2、MVC模型
MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC 以一种插件式的、松耦合的方式连接在一起。
- 模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM),对应于后台数据库
- 视图(V)- 图形界面,负责与用户的交互(页面),对应于views视图逻辑处理
- 控制器(C)- 负责转发请求,对请求进行处理,对应于路由管理
用户操作流程图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C3VlJSD5-1608613379591)(D:\workspace\Learn\图片\Django用户操作流程图.png)]
2、Django安装
2.1、Python虚拟开发环境搭建
- 安装virtualenv virtualenvwrapper
pip3 install virtualenv virtualenvwrapper
ln -s /usr/local/python36/bin/virtualenvwrapper.sh /usr/bin/virtualenvwrapper.sh
ln -s /usr/local/python36/bin/virtualenv /usr/bin/virtualenv
- 在~/.bashrc中添加行:
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/bin/virtualenvwrapper.sh
- 创建指定版本的虚拟环境
mkvirtualenv -p /usr/bin/python3 auto_test # 指定pytthon的版本
[root@node2 huawei]# mkvirtualenv -p /usr/bin/python3 auto_test
You have new mail in /var/spool/mail/root
created virtual environment CPython3.6.11.final.0-64 in 1025ms
creator CPython3Posix(dest=/root/.virtualenvs/auto_test, clear=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv)
added seed packages: pip==20.2.2, setuptools==49.6.0, wheel==0.35.1
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
virtualenvwrapper.user_scripts creating /root/.virtualenvs/auto_test/bin/predeactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/auto_test/bin/postdeactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/auto_test/bin/preactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/auto_test/bin/postactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/auto_test/bin/get_env_details
(auto_test) [root@node2 huawei]# workon auto_test
(auto_test) [root@node2 huawei]# pip list
Package Version
---------- -------
pip 20.2.2
setuptools 49.6.0
wheel 0.35.1
WARNING: You are using pip version 20.2.2; however, version 20.3 is available.
You should consider upgrading via the '/root/.virtualenvs/auto_test/bin/python -m pip install --upgrade pip' command.
2.2、Django安装和启动
(auto_test) [root@node2 huawei]# pip install django
>>> import django
>>> django.get_version()
'3.1.3'
如果输出了Django的版本号说明安装正确。
2.4、新建Django项目
安装 Django 之后,已经有了可用的管理工具 django-admin.py
我们可以使用 django-admin.py 来创建一个项目:
django-admin.py startproject auto_test
常见完成后目录结构
(auto_test) [root@node2 auto_test]# tree
.
├── auto_test
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
启动Django项目
python3 manage.py runserver 0.0.0.0:8000
[查看启动](Django: the Web framework for perfectionists with deadlines.)
3、视图和 URL 配置
3.1、创建app应用
- 可以通过
python manage.py startapp dhcp
创建app应用 - 新建一个apps的文件夹,管理所有的app
(auto_test) [root@node2 auto_test]# mkdir apps
(auto_test) [root@node2 auto_test]# mv dhcp/ ./apps/
- 配置django的配置文件,将配置的app加入,setting.py的修改如下:
# 修改点1:
import sys
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, BASE_DIR)
sys.path.insert(0, os.path.join(BASE_DIR, 'apps')) # 将apps目录加入系统路径
# 修改点2:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'dhcp',
]
3.2、编写视图逻辑和URL配置
这里以一个通过http的webapi接口为例,讲解。
如果http://10.1.107.28:8000/get_dhcp_info/
接口,获取接口相关的信息,获取的数据如下:
{"status": "success", "result": {"ip": "10.1.101.1"}}
- 在视图里面编写对应的实现逻辑,在
apps/dhcp/views.py
from django.http.response import HttpResponse
import json
# Create your views here.
def get_dhcp_info(request):
data = dict()
data['status'] = "success"
data['result'] = {"ip": "10.1.101.1"}
return HttpResponse(json.dumps(data), content_type='application/json')
- 配置url,项目的url的入口文件在
auto_test/urls.py
里面
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from apps.dhcp.views import get_dhcp_info # 引入视图里面方法
urlpatterns = [
path('admin/', admin.site.urls),
url('^get_dhcp_info/', get_dhcp_info) # 新增url路径
]
至此,http://10.1.107.28:8000/get_dhcp_info/
接口已经完成
3.3、视图和URL(路由)高级用法
- URL高级用法
3.2中,当app应用很多时候,url不方便管理,因此,可以将url放在各自的app中进行管理
- 在url的入口文件
auto_test/urls.py
里面,修改代码如下:
from django.urls import path, include
urlpatterns = [
path('dhcp/', include('apps.dhcp.urls'))
]
- 在应用dhcp的文件下面,新增urls.py的文件,自定义url规则,
vim apps/dhcp/urls.py
from django.conf.urls import url
from .views import *
urlpatterns = [
url(r'^get_dhcp_info/', get_dhcp_info)
]
至此,http://10.1.107.28:8000/dhcp/get_dhcp_info/
接口已经完成
- 视图高级用法
http请求中,包括了get、post、put、delete的请求,如果每个请求都去定义一个函数去维护,实现起来比较麻烦。Django提供了一个视图的基类,可以继承该基类,去重写http的这些请求
from django.shortcuts import render
from django.http.response import HttpResponse
from django.views.generic import View ## 新增
import json
# Create your views here.
def get_dhcp_info(request):
data = dict()
data['status'] = "success"
data['result'] = {"ip": "10.1.101.1"}
return HttpResponse(json.dumps(data), content_type='application/json')
class GetDhcpInfoView(View): ## 新增
def get(self, request):
data = dict()
data['status'] = "success"
return HttpResponse(json.dumps(data), content_type='application/json')
def post(self, request):
#print(request.body)
with open("/opt/auto_test/apps/dhcp/test.json", "r") as file:
test_data = json.load(file)
test_data.pop("a")
with open("/opt/auto_test/apps/dhcp/test1.json", "w") as file:
json.dump(test_data, file)
data = dict()
data['status'] = "success"
return HttpResponse(json.dumps(data), content_type='application/json')