Django - 入门
简介
Django 是一个开放源代码得 Web 应用框架,由Python 写成。最初用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站,即CMS(内容管理系统)软件,于2005年7月在BSD 许可证下发。Django 采用了
MTV 的框架模式,即模型(Model) 、模板(Template) 和 视图(Views),三者之间各自负责不同的职责
- 模型:数据存取层,处理与数据相关的所有事物,例如如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
- 模板:表现层,处理与表现相关的决定,例如如何在页面或其他类型的文档中进行显示。
- 视图:业务逻辑层,存取模型及调取恰当模板的相关逻辑,模型与模板之间的桥梁。
具有以下特点:
- 对象关系映射
- URL设计
- 模板系统
- 表单处理
- Cache系统
- Auth 认证系统
- 国际化
- Admin后台系统
搭建项目
# 安装
pip install django
# 命令行创建项目
django-admin startproject djangoDemo
启动方式:
方法一:
方法二:
python manage.py runserver 127.0.0.1:8000
初始项目架构:
- manage.py: 命令行工具,内置多中方式与项目进行交互。在命令行窗口下,将路径切换到djangoDemo 项目并输入python manage.py help 可以查看该工具的指令信息。
- setting.py: 项目的配置文件,项目的所有文件都需要在该文件中进行配置
- urls.py: 项目的路由设置,设置网站的具体网址内容
- wsgi.py: 用于定义Django使用的socket连接
- asgi.py: 异步服务网关接口
入门案例
- 创建App
完成项目的创建后,接着创建项目应用,项目应用简称为App,相当于网站功能,每个App代表一个网站功能,App的创建由manage.py 实现,创建指令如下:
(venv) PS E:\PyProject\djangoDemo> python manage.py startapp login
执行后会自动生成以下:
- 修改setting.py 文件
2.1 修改INSTALLD_APPS 属性
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 新添加
'login'
]
2.2 修改 TEMPLATES 添加模板的路径
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / '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',
],
},
},
]
3.template\login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/commons.css"/>
</head>
<body>
<h1>用户登录</h1>
<form method="POST" , action="/login/">
<input type="text" placeholder="用户名" name="username"/><br/>
<input type="password" placeholder="密码" name="password"/><br/>
<input type="submit" value="提交"><br/>
{{ msg}}
</form>
</body>
</html>
- login\views.py
from django.shortcuts import render,redirect
# Create your views here.
def login(request):
'''
:param request:
:return:
'''
# return HttpResponse('登录成功')
if request.method == 'GET':
return render(request, 'login.html') # 返回HTML文件
else:
# form表单提交
print('表单执行了')
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'root' and password == '123456':
return HttpResponse('登录成功')
else:
# 账号或者密码错误
return render(request, 'login.html', {'msg': '账号或密码错误'}) # 返回html文件
- djangoDemo\urls.py 配置路由规则
from login import views
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.login)
]
进行验证:
用户访问页面的过程:
- 当用户在浏览器访问网址的时候,该网址在项目所设置的路由(urls.py) 里找到相应的路由信息
- 然后从路由信息里找到对应的视图函数(views.py 文件),由视图函数处理用户请求
- 视图函数将处理结果传递到模板文件(login.html) ,由模板文件生成网页内容,并在浏览器里展现
Django 配置信息
资源文件配置
- 资源路由: STATIC_URL
一个项目在开发的过程中肯定需要使用css 和 JavaScript 文件,这些静态文件的存放主要是由配置文件setting.py 配置。Django 默认配置信息如下:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.1/howto/static-files/
STATIC_URL = '/static/'
默认情况下 Django 无法直接访问项目下所有的静态文件。
例如有以下目录结构:
djangoDemo
|
index
| - static
| - cow.jpg
|
login
| - static
|- duck.jpeg
|
static
|- dog.jpg
以下连接都无法访问静态资源:
http://localhost:8000/static/cow.jpg
http://localhost:8000/static/duck.jpeg
http://localhost:8000/static/duck.jpeg
- 资源集合:STATIC_DIRS
由于STATIC_URL 的属性性,会在开发中造成诸多不便,比如将静态文件夹存在在项目的根目录以及定义多个静态文件夹等。此时可以借助 STATIC_DIRS属性实现
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'index/static'),
os.path.join(BASE_DIR, 'login/static'),
)
配置完毕所有静态资源都可以使用 :http://localhost:8000/static/xxxx 访问
如果STATIC_URL 发生改变,比如: STATIC_URL = '/Allstatic/',那么访问路径需要更新为:http://localhost:8000/Allstatic/xxxx
- 资源部署:STATIC_ROOT
静态资源配置还有 STATIC_ROOT,其作用是在服务器上部署项目,实现服务器和项目之间的映射。STATIC_ROOT 主要收集整个项目的静态资源并存放在一个新的文件夹,然后由该文件夹与服务器之间构建映射关系。
当项目的配置属性DEBUG 设为Ture 的时候,Django 会自动提供静态文件代理服务,此时整个项目处于开发阶段,因此无须使用STATIC_ROOT。当DEBUG设置为False的时候,意味着项目进入生产环境,Django不再提供静态文件代理服务,此时需要在项目的配置文件中设置STATIC_ROOT。
设置STATIC_ROOT需要使用Django操作指令collectstatic 来收集所有静态资源,这些静态资源都会保存在STATIC_ROOT所保存的文件夹里
模板配置
在Web 开发中,模板是一种较为特殊的HTML文档。这个HTML 文档嵌入了一些能够让Django 识别的变量和指令,然后由Django 的模板引擎解析这些变量和指令,生成完整的HTML 网页并返回给用户浏览。模板是Django 里面的MTV 框架模式的T 部分,配置模板路径是告诉Django 在解析模板的时候,如何找到模板所在的位置。创建项目时,Django 已有初始的模板配置信息:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
模板配置是以列表格式呈现的,每个元素具有不同的含义,其含义说明如下:
- BACKEND: 定义模板引擎,用于识别模板里面的变量和指令。内置的模板引擎有Django Templates 和 jinja2.jinjia2,每个模板引擎都有自己的变量和指令语法。
- DIRS: 设置模板所在路径
- APP_DIRS:是否在App 里查找模板文件
- OPTIONS: 用于填充在RequestContext 的上下文(模板里面的变量和指令),一般情况下不做任何修改。
案例:当视图返回如下 render 时,html页面如何获取不同数据结构的数据?
def index(request):
return render(request,
'index.html',
{
'name': 'zhangsan',
'hobby': ['code', 'study'],
'user_dict': {'k1': 'v1', 'k2': 'v2'},
'user_list_dict': [
{'id': '1', 'name': 'zhangsan', 'email': '18701439@qq.com'},
{'id': '2', 'name': 'zhangsan2', 'email': '18701439@qq.com'},
{'id': '3', 'name': 'zhangsan3', 'email': '18701439@qq.com'}
]
})
实现:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>模板标记学习</h1>
<p>{{ name }}</p>
<p>{{ hobby.0 }}</p> <!-- 取列表数据 -->
<p>{{ hobby.1 }}</p>
<p>{{ user_dict.k1 }}</p> <!-- 取字典数据 -->
<p>{{ user_dict.k2 }}</p>
<p>{{ user_list_dict }}</p>
<table border="1">
{% for item in user_list_dict %} <!-- 获取里列表中的字典数据:[{},{}] -->
<tr>
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
<td>{{ item.email }}</td>
<td>
<a>编辑</a> | <a>删除</a>
</td>
</tr>
{% endfor %}
</table>
</body>
</html>
验证, 访问localhost:8000/index/:
总结:
1.请求返回html 页面需要 render 对象,返回的数据可以通过关键字参数context 传递
2.页面使用后台返回参数采用 {{var}} 的格式
中间件
中间件(Middlerware) 是一个用来处理Django 的请求 和响应 的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改变Django 输入和输出。
Django 接收到用户请求时,首先经过中间件处理请求信息,执行相关处理,然后将处理结果返回给用户。
开发者可以根据自己的需求自定义中间件,只要将自定义的中间件配置到MIDDLERWARE 属性即可激活。
一般情况下,Djanog默认的中间件即可满足大部分开发需求,我们在项目的MIEDDLREWARE 中添加LocaleMieddleware 中间件,使得Django 内置的功能支持中文显示。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware' # new add
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
MIDDLEWARE 的数据格式为列表,每个中间件的设置顺序是固定的,如果随意变更中间件,就很容易导致程序异常,每个中间件的说明如下:
- SecurityMiddleware: 内置的安全机制,保护用户与网站的通信安全
- SessionMiddleware:会话Session 功能
- LocaleMiddleware:国际化和本地化功能
- CommonMiddleware:处理请求信息,规范化请求内容
- CsrfViewMiddleware:开启CRSF防护功能
- AuthenticationMiddleware:开启内置的用户认证系统
- MessageMiddleware:开启内置的信息提示功能
- XFrameOptionsMiddleware:防止恶意程序单击劫持
数据库配置
项目拆跟你讲时默认采用 Sqlite3 数据库,setting.py 中有以下配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
下面讲解pymysql 连接 MySQL:
-
安装pymysql
-
新建空白数据库:django_db
-
修改MyDjango\settting.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_db',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '192.168.184.152',
'PORT': '3306'
}
}
- 初始化连接
# MyDjango\__init__.py
import pymysql
pymysql.install_as_MySQLdb()
- 验证安装成功
因为Django 自带内置功能,如Admin后台系统,Auth 用户系统和会话机制等功能,这些功能都需要借助数据表实现,如下指令可以将内置的迁移文件生成数据表:
(venv) PS E:\PyProject\MyDjango> python manage.py migrat
执行完刷新 数据库:
即执行成功。
遇到的一个问题:
Django提示mysql版本过低:django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.26).
解决:
如果不想麻烦升级数据库版本,可以直接注释相关检查的代码,文件位置: venv/Lib/site-packages/django/db/backends/base/base.py
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/16861493.html