Python 自动化(十四)Django框架

Django框架简介

起源

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后,虚拟机终端会有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
  • 进入到项目文件夹后,执行 python3 manage.py runserver 启动django服务【注:该启动方式下,Django在前台启动服务,默认监听8000端口
(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端口的服务访问多次,可以在终端看到请求日志信息,典型的前台服务,服务上线会后台启动

 

关闭服务
  • 方式1:在runserver启动终端下,执行 ctrl+c 终止服务

 然后浏览器刷新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

项目结构解析

mysite1结构

manage.py 包含项目管理的子命令
  • 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 <subcommand>' for help on a specific subcommand.
Available subcommands:
[auth]
    changepassword
    createsuperuser
[contenttypes]
    remove_stale_contenttypes
[django]
    check
    compilemessages
......
项目同名文件夹—mysite1/mysite1
__init__.py:Python包的初始化文件
wsgi.py:WEB服务网关的配置文件,Django正式启动时,需要用到
urls.py:项目的主路由配置,HTTP请求进入Django时,优先调用该文件
settings.py:项目的配置文件,包含项目启动时需要的配置
setting.py配置文件
settings.py 包含了Django项目启动的所有配置项
配置分为 公有配置 和 自定义配置
配置项格式,类似于键值对结构:
    BASE_DIR=‘XXX’
公有配置—Django官方提供的基础配置

使用Pycharm启动mysite1项目,注意:项目目录在哪里,就在那里open

配置好Pycharm后,查看项目中settings.py文件中的配置项

BASE_DIR

用于绑定当前项目的绝对路径(可动态计算),所有文件夹都可以依赖此路径

# 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)  # 当前项目的绝对路径
DEBUG

用于配置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

实验

  • 如果要在局域网其它主机也能访问此主机的Django服务,启动方式如下:
  • python3 manage.py runserver 0.0.0.0:8000,修改端口
  • 指定网络设备如果内网环境下其他主机像正常访问该站点需要加ALLOWED_HOSTS=[‘内网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服务,查看浏览器,正常显示错误信息,请求发送成功

LANGUAGE_CODE

用于指定语言配置,英文:en_us,中文:zh-Hans

实验

  • 修改LANGUAGE_CODE的值为中文显示
LANGUAGE_CODE = 'zh-Hans'
  • 启动服务并访问,查看是否修改成功————python3 manage.py runserver

TIME_ZONE

用于指定当前服务器端时区,默认是世界标准时区: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和视图函数

URL结构

定义:统一资源定位符
作用:用来表示互联网上某个资源的地址
URL的一般语法格式(注:[]代表其中的内容可以省略):
protocol://hostname[:port]/path/[?query][#fragment]
例如:https://tts.tmooc.cn/video/showVideo?menuId=123456&version=NSD999#subject
protocol(协议)

例如:https://tts.tmooc.cn中的 https://

  • https 通过安全的HTTPS访问该资源。格式 https://
  • http 通过 HTTP 访问该资源。格式 http://
  • file 资源是本地计算机上的文件。格式 file://
hostname(主机名)

例如:https://tts.tmooc.cn中的 tts.tmooc.cn

  • 是指存放资源的服务器的域名系统(DNS)主机名、域名或者IP地址
port(端口号)

例如:https://tts.tmooc.cn:80中的 80

  • 整数,可选,省略时使用方案的默认的端口
  • 各种传输协议都有默认的端口号,如https的默认端口是443
path(路由地址)

例如:https://tts.tmooc.cn/video/showVideo 中的 /video/showVideo

  • 由零或多个 / 符号隔开的字符串,一般用来表示主机上的一个目录或者文件地址
  • 路由地址决定了服务器端如何处理这个请求
query(查询)

例如:/video/showVideo?menuId=123456&version=NSD999 中的 ?menuId=123456&version=NSD999

  • 可选,用于给动态网页传递参数,如果有多个参数,用&符号隔开,每个参数的名和值用 = 符号隔开
fragment(信息片段)

例如:/showVideo?menuId=123456&version=NSD999#subject 中的 #subject

  • 字符串,用于指定网络资源的片段,类似于书签

Django处理URL请求

浏览器地址栏: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 = "<h1>这是第一个页面</h1>"
    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 = "<h1>这是第一个页面</h1>"
    return HttpResponse(html)  # 返回响应对象

查看服务是否重启,浏览器访问:http://127.0.0.1:8000/page/2023/

 

路由配置

settings.py 中的 ROOT_CONF 指定了主路由配置列表 urlpatterns 的文件位置

path函数

  • path()函数

    • 导入:from django.urls import path
    • 语法:path(route, views, name=None)
  • 参数:

    • route:字符串类型,匹配的请求路径
    • views:指定路径所对应的视图函数的名称,函数名后不加括号
    • name:为地址起别名,在模板中地址反向解析时使用
练习: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 = "<h1>这是我的首页</h1>"
    return HttpResponse(html)

def page1_view(request):
    html = "<h1>这是编号为1的网站</h1>"
    return HttpResponse(html)

def page2_view(request):
    html = "<h1>这是编号为2的网站</h1>"
    return HttpResponse(html)

依次访问需求中URL地址,查看浏览器响应

思考

建立如上100个网页怎么办?例如:

path转换器

  • 语法:<转换器类型:自定义名>
  • 作用:若转换器类型匹配到对应类型的数据,则将数据按照 关键字传参 的方式传递给视图函数
  • 例子:path('page/<int:page>', views.xxx)
转换器类型
转换器类型作用样例
str匹配除了 '/' 之外的非空字符串"v1/users/<str:username>" 匹配 v1/users/nfx
int匹配除了0或任何正整数,返回一个int"page/<int:page>" 匹配 /page/100
path匹配非空字段,包括路径分割符 '/'"v1/users/<path:ph>" 匹配 /v1/users/a/b/c

实验一

目的:该实验使用 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/<int:pg>", views.pagen_view),
]

修改 mysite1/mysite1/views.py,添加指定视图函数

from django.http import HttpResponse
# ......
# pg:该参数为path函数传来的表示页码的关键字参数,参数名不能变,变了的话程序报错
def pagen_view(request, pg):
    html = f"<h1>这是编号为{pg}的网站</h1>"
    return HttpResponse(html)

查看服务是否重启,浏览器访问:http://127.0.0.1:8000/page/3http://127.0.0.1:8000/page/4,......

实验二

目的:该实验验证 urlpatterns 列表当中的 url 地址匹配即停止的原则

  • 修改 mysite1/mysite1/views.py 中 pagen_view 函数的响应数据

def pagen_view(request, pg):
    html = f"<h1>这是编号为{pg}的网站!!!</h1>"
    return HttpResponse(html)

查看服务是否重启,浏览器访问:http://127.0.0.1:8000/page/1http://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/<int:pg>", views.pagen_view),
]
练习:path转换器

需求:实现计算器功能

  • 定义一个路由的格式为: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("<int:n>/<str:op>/<int:m>", 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"<h1>页面结果显示: {result}</h1>")

查看服务是否重启,浏览器访问加、减、乘对应的URL地址,查看结果:

思考:如果将上如需求改为只能计算两位数的算数运算,例如:20+35、10-20、50*12,该怎么做?

re_path函数

在 URL 的匹配过程中可以使用正则表达式进行精确匹配

from django.urls import re_path
from . import views

urlpatterns = [
    # ......
    # http://127.0.0.1:8000/整数/操作字符串[add/sub/mul]/整数
    re_path(r"^(?P<n>\d{1,2})/(?P<op>\w+)/(?P<m>\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"<h1>页面结果显示: {result}</h1>")
练习

需求:显示生日信息

样例:

处理方案

  • 修改 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<y>\d{4})/(?P<m>\d{1,2})/(?P<d>\d{1,2})$", views.birthday_view),
    # http://127.0.0.1:8000/birthday/1/23/2022
    re_path(r"^birthday/(?P<m>\d{1,2})/(?P<d>\d{1,2})/(?P<y>\d{4})$", views.birthday_view),
]

修改 mysite1/mysite1/views.py,添加指定视图函数

def birthday_view(request, y, m, d):
    html = f"<h1>生日为 {y}年{m}月{d}日</h1>"
    return HttpResponse(html)

查看服务是否重启,浏览器访问:http://127.0.0.1:8000/birthday/2023/11/11http://127.0.0.1:8000/birthday/1/23/2022

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值