一,安装
pip3 install django==3.2
- 查看版本号
django-admin --version
二,启动与创建项目
- 创建项目
django-admin startproject 项目名称
- 启动项目
在命令行使用cd命令进入到项目文件夹
python manage.py runserver IP 端口号
python manage.py startapp 应用名称
3.验证,访问http://IP:端口
架构学习
Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。
这个MVT模式并非django首创,在其他的语言里面也有类似的设计模式MVC,甚至可以说django里面的MVT事实上是借鉴了MVC模式衍生出来的。
M,Model,模型,是用于完成操作数据库的。
V,View,视图,里面的代码就是用于展示给客户端的页面效果。
C,Controller,控制器,是一个类或者函数,里面的代码就是用于项目功能逻辑的,一般用于调用模型来获取数据,获取到的数据通过调用视图文件返回给客户端。
MVT:
- M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
- V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
- T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
学习django就是学习MVT以及一个路由转发
目录结构
│─ manage.py 终端脚本命令,提供了一系列用于生成文件或者目录的命令,也叫脚手架
└─ 项目名称/ 主应用开发目录,保存了项目中的所有开发人员编写的代码, 目录是生成项目时指定的
│- asgi.py django3.0以后新增的,用于让django运行在异步编程模式的一个web应用对象
│- settings.py 默认开发配置文件
│- urls.py 路由列表目录,用于绑定视图和url的映射关系
│- wsgi.py wsgi就是项目运行在wsgi服务器时的入口文件
└- init.py
└─ app1 子应用
│- models 该应用的模型类模块
│- views 该应用的视图模块
│- tests 该应用的单元测试模块
│- apps 该应用的一些配置,自动生成
│- admin.py 该应用的后台管理系统配置
setting配置
- 新建web应用程序时要在INSTALLED_APPS下注册app,例如
python manage.py startapp webapp
配置如下
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'webapp.apps.StdConfig', # app注册
]
- 配置Teamplates路径
import os
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates') ] #把templates路径加到环境中
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
- 配置数据库(以mysql为例子)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 选择数据库引擎
'POST':3306,
'HOST':'127.0.0.1',
'USER':'root',
'PASSWORD':'root',
'NAME': 'db_test' # 数据库名称
}
}
- 配置静态文件路径
在STATIC_URL = 'static/'下面填写如下语句
导入os模块,在项目路径下创建static文件存放静态文件
import os
STATICFILES_DIR=[
os.path.join(BASE_DIR,"static")
]
- 配置模型类输出日志
在配置文件最后添加如下代码,在执行模型类操作数据库时会把对应操作的sql语句输出到控制台
# 配置日志
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
路由转发
访问一个网站时可以通过不同的操作去访问不同的页面这就是通过路由转发做的,django中路由转发的实现在urls.py下实现
例如我现在想编写一个主页,让用户访问,127.0.0.1:8000/index,就能看到主页
代码如下
from django.contrib import admin
from django.urls import path
from django.shortcuts import HttpResponse
def index(request):
return HttpResponse("<h1>这是主页</h1>")
urlpatterns = [
path('admin/', admin.site.urls),
path("index/",index)
]
路由
一种映射关系!路由是把客户端请求的url路径和用户请求的应用程序[这里意指django里面的视图进行绑定映射的一种关系。在django中所有的路由最终都被保存到一个变量 urlpatterns.
, urlpatterns必须声明在主应用,当客户端发送了一个http请求到服务端,服务端的web服务器则会从http协议中提取url地址, 从程序内部找到项目中添加到urlpatterns里面的所有路由信息的url进行遍历匹配。如果相等或者匹配成功,则调用当前url对象的视图方法。下的urls.py总路由中。这是由配置文件settings设置的。
基本使用
- 字符串路由
from django.urls import path
urlpatterns = [
path("index/",视图函数名)
]
- 正则路由
from django.urls import path,re_path
urlpatterns = [
path("index/",视图函数名)
re_path('正则表达式',视图函数名)
]
路由分发
创建app时app也有生成一个urls.py文件(没有就自己键一个),可以通过主路由去找到app的路由进行路由分发
from django.urls import include
urlpatterns = [
path("appname/",include("appname.urls"))
]
反向解析
当访问的路径需要一个动态路径时,可以使用反向解析解析动态路由
构造路由,只需要给路由加个name即可
from django.conf.urls import path
urlpatterns = [
path('index/',index,name='ind')
]
模板中使用
<a href="{% url 'ind' %}">2012 Archive</a>
视图函数中使用
reverse_path=reverse('int')
return redirect(reverse_path)
视图
使用路由分发找到对应的视图函数后,视图函数通过渲染后返回数据给浏览器
在views.py中编写视图函数
视图函数必须有一个request参数
视图函数必须返回一个response对象,使用render返回html,使用HttpResponse时将字符串打包成http协议的数据进行返回
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
return render(request,'index.html')
index.html在templates下创建
request对象
在创建视图函数是会传入一个request参数,这个参数了包含了request所有数据
- request.method 请求方式
- request.path
- request.body
- request.META
response对象
- HttpResponse()
- Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个 HttpRequest 对象传给视图函数。那么视图函数在处理完相关的逻辑后,也需要返回一个响应给浏览器。而这个响应,我们必须返回 HttpResponseBase 或者他的子类的对象。而 HttpResponse 则是 HttpResponseBase 用得最多的子类。
- render()
- 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
- redirect()
- 通过redirect方法实现重定向。
模板(templates)
模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了把前端代码和服务端代码分离的作用,让项目中的业务逻辑代码和数据表现代码分离,让前端开发者和服务端开发者可以更好的完成协同开发。
语法
变量
在html模板中使用{{}}定义一个变量,在使用render函数时候可以在这个位置传入变量
{{val}}
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
name = '渲染'
return render(request,'index.html',locals())
传入的变量如果是list等可以深度查询的话可以使用.深度查询
过滤器
语法
{{obj|过滤器名称:过滤器参数}}
内置过滤器
过滤器 | 用法 | 代码 |
---|---|---|
last | 获取列表/元组的最后一个成员 | {{liast | last}} |
first | 获取列表/元组的第一个成员 | {{list|first}} |
length | 获取数据的长度 | {{list | length}} |
defualt | 当变量没有值的情况下, 系统输出默认值, | {{str|default=“默认值”}} |
safe | 让系统不要对内容中的html代码进行实体转义 | {{htmlcontent| safe}} |
upper | 字母转换成大写 | {{str | upper}} |
lower | 字母转换成小写 | {{str | lower}} |
title | 每个单词首字母转换成大写 | {{str | title}} |
date | 日期时间格式转换 | `{{ value |
cut | 从内容中截取掉同样字符的内容 | {{content | cut:“hello”}} |
list | 把内容转换成列表格式 | {{content | list}} |
add | 加法 | {{num| add}} |
filesizeformat | 把文件大小的数值转换成单位表示 | {{filesize | filesizeformat}} |
join | 按指定字符拼接内容 | {{list| join(“-”)}} |
random | 随机提取某个成员 | {list | random}} |
slice | 按切片提取成员 | {{list | slice:“:-2”}} |
truncatechars | 按字符长度截取内容 | {{content | truncatechars:30}} |
truncatewords | 按单词长度截取内容 | 同上 |
标签
{% if age < 18 %}
{% endif %}#}
{% endif %}#}`
模板嵌套继承
{% include “模板文件名”%} # 模板嵌入
{% extends “base.html” %} # 模板继承