Django框架 学习过程
一、Django介绍
1.组件
包含组件如下:
- 基本配置文件/路由系统
- 模型层(M)/模板层(T)/视图层(V)
Cookies
和Session
- 分页及发邮件
Admin
管理后台
2.用途
用途一:网站/微信公众号/小程序后端开发
浏览器 --HTTP请求--> Django <--HTTP响应-- 用途二:人工智能平台融合
微信小程序 --HTTP请求--> Django --HTTP请求--> 人工智能系统 <--HTTP响应-- <--HTTP响应-- 第三方打车平台 <--HTTP响应-- <--HTTP响应--
3.安装
- 支持
Python
的版本 -3.X
在线安装
- 虚拟机执行
sudo pip3 install django==3.2.11
- 检查是否安装成功
sudo pip3 freeze|grep -i 'Django'
- 虚拟机执行
二、项目-结构
1.创建项目
- 成功安装
Django
后,虚拟机终端会有django-admin
命令 - 执行
django-admin startproject 项目名
即可创建出对应项目文件夹 - 例如 终端执行
django-admin startproject mysite1
;则创建出mysite1
项目
2.启动服务
- 启动[测试开发阶段]
- 1.终端
cd
到项目文件夹,例如cd mysite1
2.进入到项目文件夹后,执行
python3 manage.py runserver
启动django
服务- 注:该方式启动下,
Django
在前台启动服务,默认监听8000
端口
- 注:该方式启动下,
3.浏览器访问
http://127.0.0.1:8000
可看到django的启动页面- 注:如果想更换端口,则可以用
python3 manage.py runserver
端口号
- 注:如果想更换端口,则可以用
3.关闭服务
方式1:在
runserver
启动终端下- 执行
Ctrl+C
可关闭Django
服务
- 执行
方式2:在其他终端下
- 执行
sudo lsof -i:8000
查询出Django
的进程id
- 执行
kill -9
对应Django
进程id
- 执行
4.启动常见问题
问题:启动时报错
Error:That port is already in use.
- 问题原因:端口已被占用,证明当前
Django
启动时,默认监听的8000
端口已被其天涯进程占用 - 解决方案:关闭所占用
8000
端口的服务
5.结构解析
展开django项目目录,结构如下
5.manage.py
manage.py 包含项目管理的子命令,如:
python3 manage.py runserver
启动服务python3 manege.py startapp
创建应用python3 manege.py migrate
数据库迁移- ...
- 直接执行
python3 manage.py
可列出所有的Django
子命令
6.项目同名文件夹
项目同名文件夹 - mysite1/mysite1
__init__
:Python
包的初始化文件wsgi.py
:WEB
服务网关的配置文件 -Django
正式启动时,需要用到urls.py
:项目的主路由配置 -HTTP
请求进入Django
时,优先调用该文件settings.py
:项目的配置文件 - 包含项目启动时需要的配置
7.settings.py
settings.py
包含了Django
项目启动的所有配置项- 配置项分为 公有配置 和 自定义配置
- 配置项格式例:
BASE_DIR='xxx'
公有配置 -
Django
官方提供的基础配置https://docs.djangoproject.com/en/3.2/ref/settings/
8.公有配置
BASE_DIR
- 用于绑定当前项目的绝对路径(动态计算出来的),所有文件夹都可以依赖此路径
DEBUG
- 用于配置
Django
项目的启动模式 True
表示开发环境中使用 开发调试模式(用于开发中)False
表示当前项目运行在生产环境中
- 用于配置
ALLOWED_HOSTS
示例:如果要在局域网其他主机也能访问此主机的
Django
服务,启动方式如下:python3 manege.py runserver 0.0.0.0:5000
- 指定网络设备如果内网环境在其他主机想正常访问该站点,需加
ALLOWED_HOSTS=['内网IP']
设置允许访问到本项目的
host
头值[ ]
空列表,表示只有请求头中host
为127.0.0.1
,localhost
能访问本项目 -DEBUG=True
时有效['*']
,表示任何请求头的host
都能访问到当前项目['192.168.1.3','127.0.0.1']
表示只有当前两个host
头的值能访问当前项目
INSTALLED_APPS
- 指定当前项目中安装的应用列表
MIDDLEWARE
- 用于注册中间件
TEMPLATES
- 用于指定模板的配置信息
DATABASES
- 用于指定数据库的配置信息
LANGUAGE_CODE
用于指定语言配置
- 英文:"
en-us
" - 中文:"
zh-Hans
"
- 英文:"
TIME_ZONE
用于指定当前服务器端的时区
- 世界标准时间:"
UTC
" - 中国时区:"
Asia/Shanghai
"
- 世界标准时间:"
ROOT_URLCONF
用于配置主
url
配置'mysite1.urls
'ROOT_URLCONF
='mysite1.urls
'
9.自定义配置
settings.py
中也可以添加 开发人员 自定义配置配置建议:名字尽量个性化,以防覆盖掉公有配置
- 例如:
ALIPAY_KEY='XXX'
- 例如:
settings.py
中的所有配置项,都可以按需的在代码中引入- 引入方式:
from django.conf import settings
- 引入方式:
三、URL-结构
1.定义
- 即统一资源定位符
Uniform Resource Locator
2.作用
- 用来表示互联网上某个资源的资源
3.URL的一般语法格式
注:[ ]代表其中的内容可省略:
protocol://hostname[:port]/path[?query][#fragment]
4.protocol(协议)http://baidu.com
http
通过HTTP
访问该资源。格式http://
https
通过安全的HTTPS
访问该资源。格式https://
file
资源是本地计算机上的文件。格式:file:///
5.hostname(主机名)http://baidu.com
- 是指存放资源的服务器的域名系统(
DNS
)主机名、域名或IP地址
6.port(端口号)http://baidu.com:80
- 整数,可选,省略时使用方案的默认端口
- 各种传输协议都有默认的端口号,如
http
的默认端口为80
7.path(路由地址)http://baidu.com/video/showVideo
- 由零个或多个"/"符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。路由地址决定了服务器端如何处理这个请求
8.query(查询)/video/showVideo?menuld=xxx&version=xxx
- 可选,用于动态网页传递参数,可有多个参数,用"&"符号隔开,每个参数的名和值用"="符号隔开
9.fragment(信息片段)version=xxx#subject
- 字符串,用于指定网络资源中的片段。例如一个网页中有多个名词解释,可使用
fragment
直接定位到某一名词解释
四、处理URL请求
浏览器地址栏 -->
http://127.0.0.1:8000/page/2003
Django
从配置文件中根据ROOT_URLCONF
找到主路由文件;默认情况下,该文件在项目同名目录下的urls
;例如mysite1/mysite1/urls.py
Django
加载主路由文件中的urlpatterns
变量- 依次匹配
urlpatterns
中的URL
,匹配到第一个适合的中断后续匹配 - 匹配成功 - 调用对应的视图函数处理请求,返回响应
- 匹配失败 - 返回
404
响应
主路由 -
urls.py
样例from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), path('page/2003/',views.page_2003), path('page/2004/',views.page_2004), ]
五、视图函数
- 视图函数时用于接收一个浏览器请求(
HttpRequest对象
)并通过HttpResponse对象
返回响应的函数。此函数可以接收浏览器请求并根据业务逻辑返回相应的响应内容给浏览器 语法
def xxx_xxx(request[,其他参数...]): return HttpResponse对象
样例
\#
file:<项目同名文件夹下>/views.py
from django.http import HttpResponse def page1_view(request): html="<h1>这是第1个页面</h1>" return HttpResponse(html)
在
urls.py
中引用views.py
中的函数
六、路由配置
settings.py
中'ROOT_URLCONF'
指定了主路由配置列表urlpatterns
的文件位置\#
file:<项目同名文件夹下>/urls.py
urlpatterns = [ path('admin/', admin.site.urls), path('page/2003/',views.page_2003), path('page/2004/',views.page_2004), ... # 此处配置主路由 ]
1.path
path()
函数- 导入 -
from django.urls import path
- 语法 -
path(route,views,name=None)
参数:
- 1.
route
:字符串类型,匹配的请求路径 - 2.
views
:指定路径所对应的视图处理函数的名称 - 3.
name
:为地址起别名,在模板中地址反向解析时使用
- 1.
练习 - 建立一个小网站
输入网址:
http://127.0.0.1:8000
,在网页中输出:这是我的首页views.py
:
def page_home(request): html = "<h1>这是我的首页</h1>" return HttpResponse(html)
urls.py
:
path('', views.page_home),
网页:
- 输入网址:
http://127.0.0.1:8000/page/1
,在网页中输出:这是编号为1的网页 views.py
:def page_1(request): html = "<h1>这是编号为1的网页</h1>" return HttpResponse(html)
urls.py
:path('page/1/', views.page_1),
网页:
- 输入网址:
http://127.0.0.1:8000/page/2
,在网页中输出:这是编号为2的网页 views.py
:def page_2(request): html = "<h1>这是编号为2的网页</h1>" return HttpResponse(html)
- 输入网址:
urls.py
:path('page/2/', views.page_2),
网页:
2.path转换器
- 语法:<转换器类型:自定义名>
- 作用:若转换器类型匹配到对应类型的数据,则将数据按照关键字传参方式传递给视图函数
例子:
path('page/\<int:page>',views.xxx)
转换器类型 作用 样例 str 匹配除了'/'之外的非空字符串 "v1/users/<str:username>"匹配/v1/users/zhangsan int 匹配0或任何正整数。返回一个int "page/<int:page>"匹配/page/100 slug 匹配任意由ASCII字母或数字以及连字符和下划线组成的短标签 "detail/<slug:sl>"匹配/detail/this-is-django path 匹配非空字段,包括路径分隔符'/' "v1/users/<path:ph>"匹配/v1/goods/a/b/c 练习:小计算器
定义一个路由格式为:
`http://127.0.0.1:8000/整数/操作字符串[add/sub/mul]/整数`
- 从路由表中提取数据,做相应的操作后返回给浏览器
效果如下:
输入:
http://127.0.0.1:8000/100/add/200
页面显示结果:
300
urls.py
:path('<int:n>/<str:op>/<int:m>', views.cal)
views.py
:def cal(request, n, op, m): if op not in ['add', 'sub', 'mul']: return HttpResponse('Ur op is wrong!') result = 0 if op == 'add': result = n + m elif op == 'sub': result = n - m elif op == 'mul': result = n * m return HttpResponse('<h1>结果为:%s</h1>' % result)