2005年发布,采用Python语言编写的开源web框架
早期的时候Django主做新闻和内容管理
重量级的Python Web框架,Django配备了常用的大部分组件
用途一:网站/微信公众号/小程序后端开发
用途二:人工智能平台融合
用途三:......
在终端直接执行以下命令:
# 使用pip3软件
pip3 install django==2.2.12
# 检查是否安装成功
pip3 list|grep -i django==2.2.12
官网下载离线安装包—下载指定版本的Django软件包
tar xf Django-2.2.12.tar.gz # 解压缩
cd Django-2.2.12 # 进入目录
python3 setup.py install # 执行安装
pip3 list|grep -i django==2.2.12 # 检查是否安装成功
成功安装Django后,虚拟机终端会有django-admin命令,执行django-admin startproject项目名,即可创建出对应项目文件夹。
[root@localhost projects]# django-admin startproject mysite1
[root@localhost projects]# ls
mysite1
[root@localhost projects]# cd mysite1/
[root@localhost mysite1]# ls
manage.py mysite1
启动[测试开发阶段]
终端 cd 进入到项目文件夹,例如:cd mysite1;
(testenv) [root@localhost mysite1]# pwd
/root/projects/mysite1
(testenv) [root@localhost mysite1]# python3 manage.py runserver # 启动服务
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
February 21, 2023 - 15:19:11
Django version 2.2.12, using settings 'mysite1.settings' # 关注最后三行
Starting development server at http://127.0.0.1:8000/ # 开发测试环境,损失性能
Quit the server with CONTROL-C.
浏览器访问 http://127.0.0.1:8000,可看到django的启动页面【注:如果想更换端口,可以使用python3 manage.py runserver 端口号】
切换端口启动服务,重新打开一个终端进行实验,使用5000端口启动Django服务
(testenv) [root@localhost mysite1]# python3 manage.py runserver 5000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
February 21, 2023 - 15:27:45
Django version 2.2.12, using settings 'mysite1.settings'
Starting development server at http://127.0.0.1:5000/ # 5000端口启动
Quit the server with CONTROL-C.
浏览器访问 127.0.0.1:5000 端口的URL地址
8000端口的服务访问多次,可以在终端看到请求日志信息,典型的前台服务,服务上线会后台启动
然后浏览器刷新8000端口的服务页面,会刷新失败,表示服务已终止
方式2:在其他终端下执行结束进程的命令
[root@localhost mysite1]# ss -nutlp|grep 5000
tcp LISTEN 0 10 127.0.0.1:5000 0.0.0.0:* users:(("python3",pid=84770,fd=4))
[root@localhost mysite1]# kill -9 84770
浏览器刷新页面,服务连接失败
启动常见问题
错误原因:端口号被占用,证明当前Django服务已经启动,默认监听的8000端口已被其他进程占用
解决:参考关闭服务方式2
python3 manage.py runserver 启动服务
python3 manage.py startapp 创建应用
python3 manage.py migrate 数据库迁移
……
直接执行 python3 manage.py 可列出所有Django子命令,并且会对命令进行分类
(testenv) [root@localhost mysite1]# python3 manage.py
Type 'manage.py help ' for help on a specific subcommand.
Available subcommands:
[auth]
changepassword
createsuperuser
[contenttypes]
remove_stale_contenttypes
[django]
check
compilemessages
......
__init__.py:Python包的初始化文件
wsgi.py:WEB服务网关的配置文件,Django正式启动时,需要用到
urls.py:项目的主路由配置,HTTP请求进入Django时,优先调用该文件
settings.py:项目的配置文件,包含项目启动时需要的配置
settings.py 包含了Django项目启动的所有配置项
配置分为 公有配置 和 自定义配置
配置项格式,类似于键值对结构:
BASE_DIR=‘XXX’
公有配置—Django官方提供的基础配置
使用Pycharm启动mysite1项目,注意:项目目录在哪里,就在那里open
配置好Pycharm后,查看项目中settings.py文件中的配置项
用于绑定当前项目的绝对路径(可动态计算),所有文件夹都可以依赖此路径
# settings.py
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 打印结果:/root/projects/mysite1/mysite1/settings.py
# print(os.path.abspath(__file__))
# 打印结果:/root/projects/mysite1/mysite1
# print(os.path.dirname(os.path.abspath(__file__)))
# 打印结果:/root/projects/mysite1
# print(BASE_DIR) # 当前项目的绝对路径
用于配置Django项目的启动模式,两种取值方式:
True:表示开发环境中使用,开发调试模式(用于开发测试阶段)
检测代码改动后,立刻启动服务
如果服务出错,会提示报错界面
False:表示当前项目运行在生产环境中,正式启动模式/上线模式
将DEBUG修改为False,然后修改 ALLOWED_HOSTS = ["127.0.0.1"]
DEBUG = False
ALLOWED_HOSTS = ["127.0.0.1"]
启动服务,访问不存在页面地址,不对外暴漏报错具体信息
ALLOWED_HOSTS
设置允许访问到本项目的host头值
[] 空列表,表示只有请求头中host值为 127.0.0.1,localhost才能访问本项目,DEBUG=True时生效
["*"],表示任何请求头的host都能访问到当前项目
例如 [‘192.168.1.3’,’127.0.0.1’]表示只有当前两个host头的值可以访问当前项目,可用于后期配置域名或者公网IP地址,过滤具有攻击性质的IP
实验
# settings.py
DEBUG = True # 正常显示错误信息
ALLOWED_HOSTS = [] # 首先不添加内网IP地址
# 启动服务
python3 manage.py runserver 0.0.0.0:8000
使用内网地址Django服务,查看浏览器
# settings.py
DEBUG = True # 正常显示错误信息
ALLOWED_HOSTS = ["内网IP地址"] # 添加内网IP地址
# 启动服务
python3 manage.py runserver 0.0.0.0:8000
使用内网地址Django服务,查看浏览器,正常显示错误信息,请求发送成功
用于指定语言配置,英文:en_us,中文:zh-Hans
实验
LANGUAGE_CODE = 'zh-Hans'
启动服务并访问,查看是否修改成功————python3 manage.py runserver
用于指定当前服务器端时区,默认是世界标准时区:UTC,可以修改成中国时区:Asia/Shanghai
实验
将服务时间改为中国时区,修改 TIME_ZONE 配置
TIME_ZONE = 'Asia/Shanghai'
启动服务并访问,查看终端打印时间信息————python3 manage.py runserver
其他公有配置
INSTALLED_APPS:指定当前项目中安装的应用列表
MIDDLEWARE:用于注册中间件
TEMPLATES:用于指定模板的配置信息
DATABASES:用于指定数据库的配置信息
ROOT_URLCONF:用于配置主 url
上述都是一些公有配置,下面给大家介绍自定配置的规则和使用
settings.py 中也可以添加开发人员的一些自定义配置
配置建议:名字尽量个性化,以防覆盖掉公有配置
例如:ALIPAY_KEY = ‘xxxxxxxx’
settings.py中的所有配置项,都可以按需的在代码中引入
引入方式:from django.conf import settings
定义:统一资源定位符
作用:用来表示互联网上某个资源的地址
URL的一般语法格式(注:[]代表其中的内容可以省略):
protocol://hostname[:port]/path/[?query][#fragment]
例如:https://tts.tmooc.cn/video/showVideo?menuId=123456&version=NSD999#subject
例如:https://tts.tmooc.cn中的 https://
例如:https://tts.tmooc.cn中的 tts.tmooc.cn
例如:https://tts.tmooc.cn:80中的 80
例如:https://tts.tmooc.cn/video/showVideo 中的 /video/showVideo
例如:/video/showVideo?menuId=123456&version=NSD999 中的 ?menuId=123456&version=NSD999
例如:/showVideo?menuId=123456&version=NSD999#subject 中的 #subject
浏览器地址栏:http://127.0.0.1:8000/page/1234
1.Django从配置文件中根据ROOT_CONF找到主路由文件,默认情况下,该文件在项目同名目录下的urls中;例如mysite1/mysite1/urls.py
主路由—urls.py样例
from django.urls import path
from . import views
urlpatterns = [
path("admin/", admin.site.url),
path("page/2023/", views.page_2023),
path("page/2024/", views.page_2024),
]
2.Django加载主路由文件中的urlpatterns变量 [包含很多路由的数组]
3.依次匹配urlpatterns中的path,匹配到第一个合适的中断后续匹配,即匹配即停止
4.匹配成功:调用对应的视图函数处理请求,返回响应
5.匹配失败:返回404响应
功能及定义
视图函数是用于接收一个浏览器请求(HttpRequest对象)并通过HttpResponse对象返回响应的函数
此函数可以根据浏览器请求并根据业务逻辑返回相应的相应内容给浏览器
语法
def xxx_view(request[, 其他参数…]):
return HttpResponse对象
样例
# file: <项目同名文件夹>/views.py
from django.http import HttpResponse
def page1_view(request):
html = "这是第一个页面
"
return HttpResponse(html)
实验:一次完整的请求与响应过程
修改 mysite1/mysite1/urls.py 文件,添加路由配置
from django.contrib import admin
from django.urls import path
from . import views # 相对导入方式,导入一会要创建的视图函数模块
urlpatterns = [
path('admin/', admin.site.urls),
# 添加请求路径,该请求路径对应的完整URL地址:http://127.0.0.1:8000/page/2023/
path('page/2023/', views.page_2023_view)
]
在项目同名目录下创建 views.py 文件
编写视图函数 page_2023_view
from django.http import HttpResponse # 导入Django框架中响应类HttpResponse
def page_2023_view(request):
html = "这是第一个页面
"
return HttpResponse(html) # 返回响应对象
查看服务是否重启,浏览器访问:http://127.0.0.1:8000/page/2023/
settings.py 中的 ROOT_CONF
指定了主路由配置列表 urlpatterns 的文件位置
path()函数
参数:
需求:建立一个小网站
处理方案
修改 mysite1/mysite1/urls.py,添加指定路由
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
# http://127.0.0.1:8000/page/2023/
path('page/2023/', views.page_2023_view),
path("", views.index_view), # http://127.0.0.1:8000
path("page/1", views.page1_view), # http://127.0.0.1:8000/page/1
path("page/2", views.page2_view), # http://127.0.0.1:8000/page/2
]
修改 mysite1/mysite1/views.py,添加指定视图函数
from django.http import HttpResponse
# 之前内容省略......
def index_view(request):
html = "这是我的首页
"
return HttpResponse(html)
def page1_view(request):
html = "这是编号为1的网站
"
return HttpResponse(html)
def page2_view(request):
html = "这是编号为2的网站
"
return HttpResponse(html)
依次访问需求中URL地址,查看浏览器响应
思考
建立如上100个网页怎么办?例如:
<转换器类型:自定义名>
path('page/', views.xxx)
转换器类型 | 作用 | 样例 |
---|---|---|
str | 匹配除了 '/' 之外的非空字符串 | "v1/users/ |
int | 匹配除了0或任何正整数,返回一个int | "page/ |
path | 匹配非空字段,包括路径分割符 '/' | "v1/users/ |
目的:该实验使用 path 转换器解决多组相似 url 地址表示的 path 函数重复编写的问题
修改 mysite1/mysite1/urls.py,添加path转换器对应的路由
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
# ......
# http://127.0.0.1:8000/page/3~n
# pg关键字参数,类型是int,传递给pagen_view函数
path("page/", views.pagen_view),
]
修改 mysite1/mysite1/views.py,添加指定视图函数
from django.http import HttpResponse
# ......
# pg:该参数为path函数传来的表示页码的关键字参数,参数名不能变,变了的话程序报错
def pagen_view(request, pg):
html = f"这是编号为{pg}的网站
"
return HttpResponse(html)
查看服务是否重启,浏览器访问:http://127.0.0.1:8000/page/3,http://127.0.0.1:8000/page/4,......
目的:该实验验证 urlpatterns 列表当中的 url 地址匹配即停止的原则
修改 mysite1/mysite1/views.py 中 pagen_view 函数的响应数据
def pagen_view(request, pg):
html = f"这是编号为{pg}的网站!!!
"
return HttpResponse(html)
查看服务是否重启,浏览器访问:http://127.0.0.1:8000/page/1,http://127.0.0.1:8000/page/3,......
page 页码在 3 以后响应数据都有叹号,1 和 2 两个页面不会有叹号
urlpatterns = [
# ......
# http://127.0.0.1:8000
path("", views.index_view),
# http://127.0.0.1:8000/page/1
path("page/1", views.page1_view),
# http://127.0.0.1:8000/page/2
path("page/2", views.page2_view),
# http://127.0.0.1:8000/page/3~100
path("page/", views.pagen_view),
]
需求:实现计算器功能
定义一个路由的格式为:http://127.0.0.1:8000/整数/操作字符串[add/sub/mul]/整数
从路由中提取数据,做相应的操作后返回给浏览器
效果如下:
处理方案
修改 mysite1/mysite1/urls.py,添加path转换器对应的路由
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
# ......
# http://127.0.0.1:8000/整数/操作字符串[add/sub/mul]/整数
# n:表示第一个数,op:表示操作符,m:表示第二个数
path("//", views.cal_view),
]
修改 mysite1/mysite1/views.py,添加指定视图函数
from django.http import HttpResponse
# ......
def cal_view(request, n, op, m):
if op not in ["add", "sub", "mul"]: # 数据校验
return HttpResponse("Your op is wrong!")
if op == "add":
result = n + m # 加法
elif op == "sub":
result = n - m # 减法
else:
result = n * m # 乘法
return HttpResponse(f"页面结果显示: {result}
")
查看服务是否重启,浏览器访问加、减、乘对应的URL地址,查看结果:
思考:如果将上如需求改为只能计算两位数的算数运算,例如:20+35、10-20、50*12,该怎么做?
在 URL 的匹配过程中可以使用正则表达式进行精确匹配
语法:re_path(reg, views, name=xxx)
正则表达式为命名分组模式 (?P
样例
可匹配:http://127.0.0.1:8000/20/add/40
不可匹配:http://127.0.0.1:8000/200/add/400
from django.urls import re_path
from . import views
urlpatterns = [
# ......
# http://127.0.0.1:8000/整数/操作字符串[add/sub/mul]/整数
re_path(r"^(?P\d{1,2})/(?P\w+)/(?P\d{1,2})?", views.cal_view),
]
因为此方式传递参数都是字符串类型,所以需要对视图函数中的数据进行类型转换,方可进行算数运算
def cal_view(request, n, op, m):
n, m = int(n), int(m) # 需要进行整数类型转换
if op not in ["add", "sub", "mul"]:
return HttpResponse("Your op is wrong!")
if op == "add":
result = n + m
elif op == "sub":
result = n - m
else:
result = n * m
return HttpResponse(f"页面结果显示: {result}
")
需求:显示生日信息
样例:
处理方案
修改 mysite1/mysite1/urls.py,添加 re_path 对应的路由
from django.urls import re_path
from . import views
urlpatterns = [
# ......
# http://127.0.0.1:8000/birthday/2023/11/11
re_path(r"^birthday/(?P\d{4})/(?P\d{1,2})/(?P\d{1,2})$", views.birthday_view),
# http://127.0.0.1:8000/birthday/1/23/2022
re_path(r"^birthday/(?P\d{1,2})/(?P\d{1,2})/(?P\d{4})$", views.birthday_view),
]
修改 mysite1/mysite1/views.py,添加指定视图函数
def birthday_view(request, y, m, d):
html = f"生日为 {y}年{m}月{d}日
"
return HttpResponse(html)
查看服务是否重启,浏览器访问:http://127.0.0.1:8000/birthday/2023/11/11 和 http://127.0.0.1:8000/birthday/1/23/2022