基本指令集
https://www.bilibili.com/video/BV1vK4y1o7jH?p=5&spm_id_from=pageDriverP5
创建项目:django-admin startproject mysite1(项目名称)
启动项目:python3 manage.py runserver(默认8000端口)
更换端口启动:python3 manage.py runserver 5000(启动端口号)
查看manage命令集:python3 manage.py
查看运行详情:sudo lsof -i:5000(端口号)
COMMAND PID USER FD TYPY DEVICE SIZE/OFF NODE NAME python3 39423(线程号) tarena 4u IPv4 801218 0t0 TCP localhost:5000(LISTEN)
杀死进程:sudo kill -9 39423(项目线程号)
项目结构
Djangotest01 #(项目名称)
|- db.sqlite3 # 默认存储数据库(第一次启动项目时被创建,可以替换成别的数据库)
|- manage.py # 指令集
|- DjangoTest01 # (同项目名称)
|- _init_.py #(Python包初始化文件)
|- _pycache_
| |- _init_.cpython-36.pyc
| |- settings.cpython-36.pyc
| |- urls.cpython-36.pyc
| |- wsgi.cpython-36.pyc
|- settings.py # 配置文件
|- urls.py # 项目主路由配置 -HTTP 请求进入Django时,优先调用该文件
|- wsgi.py # web 服务器网关配置文件 -Django正式启动时,需要用到
2 directories,10 files _
settings.py (配置文件)
- 分为
- 公有配置(项目已经存在的配置)
- 自定义配置
- 配置项格式: BASE_DIR='xxxx’
- 名字必须是大写的
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(_file_)))
# 基础目录地址 = 项目绝对路径
从内到外
os.path.abspath(file)
👆🏻👆🏻👆🏻 settings.py 这个文件的绝对路径
往外两层,也就是项目的绝对路径
DEBUG = True
# 检测代码改动后,立刻重启服务
# 如果代码报错,浏览器访问会显示 报错页面(信息量极大)
# 发布时改为 False
ALLOWED_HOSTS = []
# 请求头的值,当请求头的值在这里才接收请求
# 注意:里面填写的并不是客户机IP,而是请求头所写的地址
值为null且Debug为True,则默认接127.0.0.1和localhost
值为 ’ * ’ 则接所有的请求;
- 局域网内网访问设置
- 启动:python3 manage.py runserver 0.0.0.0:5000
- 指定请求头:ALLOWED_HOSTS=[‘内网IP’]
DATABASES = {
'default':{
'ENGINE':'django.db.backends.sqlite3',
'NAME':os.path.join(BASE_DIR,'db.sqlite3')
}
}
# 数据库配置
LANGUAGE_CODE = 'en-us'
# 语言(小火箭界面)
# 中文:zh-Hans
TIME_ZONE = 'UTC'
# 格林威治时间
# 东八区为:Asia/Shanghai
ROOT_URLCONF = 'mysite1.urls'
# 用于配置主 url 配置
URL 和 视图函数
protocol://hostname[:port]/path[?query][#fragment]
- Protocol :协议(http or https)
- hostname :域名 或 IP
- port :端口号(默认http是80端口所以一般不写,可以省略)
- path:路由,具体访问网站下的哪个资源
- query:查询字符串
- #fragment:宝典,快速访问某一个标题栏
-
protocol(协议)http://yiyibook.com
- http / https / file( file:/// )
-
Hostname (主机名) http://yiyibook.com
-
Port(端口号) :http://yiyibook.com:80
-
Path(路由地址)http://tts.tmooc.cn/video/showVideo
-
Query (查询) /video/showVideo?menuld = 657421&version=AID999
- 以 ’ ? '连接
- key = value
- 多个键值对之间用 ’ & ’ 连接
-
fragment (信息片段)version=AID999#subject
- 以 ’ # ’ 开始
- 用于跳到某个标签(网页的某个位置,类似于书签 或 标题)
处理URL请求
浏览器 地址栏 -> http://127.0.0.1:8000/page/2003/
1、Django从配置文件中 根据ROOT_URLCONF 找到 主路由文件;默认情况下,该文件在 项目名同名目录下的urls;例如:DjangoTest01/DjangoTest01/srls.py
2、Django 加载主路由文件中的urlpatterns 变量[包含很多路由的数组]
3、依次匹配 urlpatterns 中的path,匹配到第一个合适的终端后续匹配
4、匹配成功 - 调用对应视图函数处理请求,返回响应(找到后就不会继续往下找了)
5、匹配失败 - 返回 404 响应
urls.py & 视图函数
# urls.py 文件
import . from views
urlpatterns = [
path('admin/', admin.site.urls),
#http://127.0.0.1:8000/page/2003
path('page/2003/',views.page_2003)
]
# 视图函数
# def xxx_view(request[,其他参数]):
# return HttpResponse对象
# 示例 file<项目同名文件夹下> /views.py
from django.http import HttpResponse
def page1_view(request):
html = "<h1>这是第一个界面</h1>"
return HttpResponse(html)
Path 转换器
思考:
系统中有100个路由,分别是:
http://127.0.0.1:8000/page/1
http://127.0.0.1:8000/page/2
……
http://127.0.0.1:8000/page/100
可以实现,但是比较麻烦,这些请求除了末端数字不一样以外其余完全一致,则可以考虑使用Path 转换器来实现。
- 语法 : <转换器类型:自定义名>
- 作用:若转换器类型匹配到对应类型的数据,则将数据按照关键字传参的方式传递给视图函数
- 例子:
path('page/<int:page>',views.xxx )
转换器类型 | 作用 | 样例 |
---|---|---|
str | 匹配除了’/'外的非空字符串 | "V1/users/< str:username >"匹配/v1/users/guoxiaonao |
int | 匹配0或任何正整数,返回一个int | "Page/< int:page >"匹配/page/100 |
slug | 匹配任意由ASCII字母或数字以及连字符、下划线组成的短标签 | "Detail/< slug:sl >"匹配/detail/this-is-django |
path | 匹配非空字段,包括路径分隔符’/’ | "V1/user/< path:ph >"匹配/v1/goods/a/b/c |
# url.py
path('page/< int:pg >',views.pagen_view)
# views.py
def pagen_view(request,pg):
html='这是编号为%s的网页'%(pg)
return HttpResponse(html)
# 实例 计算机
# 效果 当地址栏中输入 127.0.0.1:8000/200/add/300 时 显示500(200与300可变,返回值为两数字之和)
# urls.py
path('<int;x>/<str:op><int:y>',view.cal_view)
# views.py
def cal_view(request,x,op,y):
result = 0
if op not in['add','sub','mul']:
return HttpResponse('Your op is wrong')
if op == 'add':
result = x+y
if op == 'sub':
result = x-y
if op == 'mul':
result = x* y
html = '结果是%s'%(result)
return HttpResponse(html)
Path 函数 与 Path 转换器 结束
路由转换器2-正则 re-path re = 正则
-
re_path函数
-
在 url 的匹配过程中可以使用正则表达式进行精准匹配
-
语法
- re_path(reg,view,name=xxx)
- 正则表达式为命名分组模式 (?P< name (组名)>pattern); 匹配提取参数后用关键字传参方式传递给视图函数
# 计算器,只计算 两位数 加减乘 两位数
# 三位数不可用
from django.urls import path.re_path
urlpatterns = [
path('admin/',admin.site.urls),
re_path(r'^(?P<x>\d{1,2})/(?P<op>\w+)/(?P<y>\d{1,2})$',views.cal2_view),
]
# r 原始字符串
# ^ 以……开头
# $ 以……结尾
# <x> 的命名分组,里面的正则为
# \d 整数类型
# {1,2} 1~2位
# 总体 以^开头的x组1~2位的整数型数字 + 一个字符 + 以一个1~2位的整数型y 结尾
def cal2_view(request,x,op,y){
html = 'x:%s op:%s y:%s'%(x,op,y) # 不进行运算 直接返回
return HttpReponse(html)
}