这里是总结 Django 框架的使用经验帖子,下面只是对开发 Django 框架的一个基础学习总结。
操作系统: Window 10
工具:Pycharm
开源免费的Python语言的 Web应用开发框架,这是最出名的一个框架,第二出名的是 Flask 框架。
基本上可以支持 5000 人同时在线的负载,所以不要以为 Python 语言的 Web 能力不行,当然也不要太过乐观。
Pycharm Professional (专业版) 最新版本的都可以——破解的话,其实不用,网上存在一些好心人,有激活码免费提供,如果激活码不行的话,可能被人注册太多次了,失效了,就需要你花点时间去弄破解,当然听说破解版问题挺多的,就看你愿不愿意氪金了,专业版才自带有Django框架,不过这问题不大,其实只要有 Pycharm community (社区版的也可以),后面会有命令行创建 Django 的详解,而且我个人也比较推荐命令行创建,不然自动创建有时候,你都不知道帮你创了哪些东西给你。
Python 的虚拟环境有三个方案选择
conda 和 virtualenv 差不多,但我个人觉得比较好用的是 virtualenv ,这是一个虚拟环境文件夹,可以直接用来打包之类的,转移项目也方便很多。
Windows 命令行创建 Python 虚拟环境 virtualenv 的指令:
python -m venv 你的项目简称名
这样就可以等下在虚拟环境内创建 Django 项目
注意这里的 hmsys 代指—— house management system
虚拟环境创建好了,一般只有下面 pip list
的这两个包,Django 框架还需要下载安装到虚拟环境内,当然如果是使用 Pycharm 创建的 Django 项目,那就直接帮你安装好了 Django 框架
pip list
cd 虚拟环境下的 Scripts 目录下
这样才可以调用虚拟环境内的 pip
指令下载 django 框架
pip install django
特别特别注意:如果要使用虚拟环境的 pip
指令,就一定一定必须要到相应的虚拟环境的 Scripts 目录下,用 pip
指令,否则你是不可能使用虚拟环境的 pip 指令的,因为你在别的目录下用的 pip
指令,是本机全局 python 语言运行环境下的 pip
指令,所以你用 pip
指令,如:pip install 安装包名
这样的指令是为本机安装的,而不是为虚拟环境安装的包。如果在没有解决全局 python 环境切换的 bug 问题,就不要因为 activate
激活了虚拟环境,就产生非虚拟环境下Scripts目录下 的 pip
指令,是属于虚拟环境 virutalenv
内的 pip
指令的错觉,
了解一下就可以了,其实如果不是在 虚拟环境下的 Scirpts 目录,使用 django-admin.exe
指令,那么就是在调用本地的python环境下的 django-admin.exe
指令,但是呢,其实无论是调用本地,还是虚拟环境下的 django-admin.exe
起到的项目创建功能,是一样的,没区别的,不要被activate
指令给弄乱了,也不要因为我这一系列的解释,弄混了 本地的django-admin.exe
指令和虚拟环境内的 django-admin.exe
的作用是有区别的,
Django 安装和搭建 virtualenv 虚拟环境(超详细完整步骤)
先说下,目前使用 Django 2.0 版本来开发项目居多,在这里得注意一下 Django 框架的版本,如果是 Django 3.0版本,我个人感觉 bug 比较多
说下安装和卸载的命令:
# 安装 Django 框架 2.0 版本
pip install django==2.0
# 卸载 Djanog 框架 2.0 版本
pip uninstall django==2.0
Django 项目可以不创建虚拟环境,不在虚拟环境内创建 Django 项目,但是后期有点麻烦,所以这里演示一番怎么创建的,但是还是比较建议创建虚拟环境后,在虚拟环境内创建 Django 项目。
Windows:
这里是手动创建一个目录,然后在创建 django 项目,pycharm professional 可以自动创建的,不过一般而言,这里是需要先创建 Django 框架的 Python 虚拟环境,在使用这条命令创建 Django 项目的,个人强烈建议。
mkdir 创建虚拟环境目录
cd 虚拟环境名
django-admin startproject 项目名
Pycharm profeesional 内可以直接创建,具体如下
结果如下所示,在虚拟环境下的 Script 目录下创建一个名为 Hmsys 的 Django 项目:
关于在虚拟环境 virtualenv
内创建 Django 项目——可以不按照我的思路走,比如说在 虚拟环境下 hmsys内的 Script 目录下创建Django 项目,你都可以在虚拟环境的文件夹内,自己弄一个自己喜欢的文件放自己创建的 Django项目,下面演示一下我找的一个还不错的 Django 项目名和与虚拟环境名的取法,两者联合应用——虚拟环境使用 Django 项目的名字,Django 项目名字定为 config
,这样后面直接打包整个虚拟环境就行了。
当然目前我是这样想的,有什么问题也可提出。
django-admin startproject 项目名称
例如
D:\>cd D:\PythonProject\hmsys
D:\PythonProject\hmsys>django-admin startproject config
D:\PythonProject\hmsys>
这样给人的感觉很不错,项目名也没那么容易重复了,virtualenv 虚拟环境名就是项目名,config 配置文件,对项目进行配置,当然这里我只是对于我个人而言感觉较好的,做个笔记,可以自行选择,不必跟风。
不经意间注意到这 Windows 命令行创建的好处,那就是每次我使用 Pycharm 创建 Django 项目后,想要删除 Django 项目,然后指定创建好的 virtualenv
虚拟环境的 Python 解释器,都会给我自行创建一个(1)(2)(3)…(n),所以这就很烦了,动用 Windows 命令行 创建就不会再出现这种糟糕情况,强迫症福音。
推荐使用命令来创建 Django 项目:
django-admin startproject
项目名称
在 Pycharm 工具的设置 setting 里面点击 Python 解释器,选择虚拟环境下的解释器,点击 Apply 或 OK,就不会出现(1)(2)(3)…(n) 的这种情况了,因为不涉及创建 Django 项目,而是选择解释器而已。
cd 到虚拟环境的 Script 目录下 activate
进入虚拟环境 hmsys
导出所需的依赖包(第三方模块)
pip list > D:\PythonProject\hmsys\test.txt
pip freeze > D:\PythonProject\hmsys\requirements.txt
我觉得 pip list
比较好看点,推荐使用 pip list > txt文件绝对路径
deactivate
虚拟环境 virtualenv 的创建、删除、退出、快速搭建开发环境链接
步骤:
命令行先进入虚拟环境下,激活虚拟环境后再 cd 到 Django 项目下,运行此 Django Web 服务命令
如:
# 进入 hmsys 虚拟环境文件夹内的 Script 文件内,
# 里面存在一个 activate 运行文件
D:\>cd D:\PythonProject\hmsys\Scripts
# 激活虚拟环境 hmsys
activate
# config 是我的 Django 项目名
cd D:\PythonProject\hmsys\config
python manage.py runserver 0.0.0.0:80
启动 Web 服务命令后,在随意哪种浏览器的URL栏里输入 127.0.0.1
注意:因为这里设置的端口为 80 端口,那么只需要 127.0.0.1,如果设置的是如 8000 这样的端口,那么就需要输入 127.0.0.1:8000,否则无法正确显示,Pycharm 运行 Django 项目默认的是 8000 端口
打开config项目,点击 开始运行 (绿色按钮)
运行后结果:点击蓝色的 127.0.0.1:8000,便会自动弹出浏览器,默认 Microsoft Edge 浏览器
注意:如果想要用本机的 IP 地址(eg:192.168.1.1,这里可以配置网卡为静态 IP 地址)访问 Django,而不是 127.0.0.1 这样的,那么就需要在 settings.py
文件内找到 ALLOWED_HOSTS = []
在方框内添加自己本机的 IP 地址,同理想要用 localhost
访问,也是一样,直接添加就可以了,端口不需要,默认自动加。
补充说明:后面测试下,发现虽然一开始 Pycharm 是用 127.0.0.1:8000 ,默认配置启动 Web 服务,但是后面一旦改了ALLOWED_HOSTS = []
的配置,就会完全按照这个配置来运行,所以需要加上一个 ‘127.0.0.1’ 否则报错
Django 中的一个
app
就是项目里面的一个应用的意思。一个项目包含多个app
。
一个app
通常就是一个相对独立的模块 ,实现相对独立的功能。
比如,我们可以把 这个系统的 管理员管理的功能 做在一个名字为 usr 的app
里面,把 销售人员的操作功能 实现在另外一个名字为
sales 的app
里面。
一个app
本质上 就是一个 Python 文件夹, 里面包含了一些应用相关的代码文件。
所以删除
app
,就等同于删除app
这个文件夹,不必担心无法删除的情况
通俗点理解:
app
在后端显示的是一个特定总的功能栏,能够放其他的一些操作的,比如我弄了一个功能栏,这个主要功能是给一个部门用的,因为这个系统是多个部门共用的,那么就会弄出几个app
来分别给这几个部门用,比如有两个部门,就大概需要两个app
,所以就规定了某个app
功能是给特定部门用的,如销售部的用销售部指定的app
功能,会计部的用会计部指定的app
功能,这里会用到一个功能权限管理的操作,先提前说下。
当然,一个项目分成多少个
app
这完全取决你的设计。 你把所有的功能都放入一个大app内也可以实现功能,只是这样做,这个app
特别的臃肿。
这里说的臃肿类似把 销售人员的日常操作功能放到的会计部门的日常操作功能栏里,这样就很奇怪了,比如 app 叫 统计管理,统计管理里面分了几个子功能 客户报表分析、楼盘销售报表、银行按揭统计、财务统计报表,还有一个 app 叫 客户管理,子功能是 登记客户信息、客户消息、业务提醒、黑名单,那么如果将它们所有的子功能放在一个 app 如 客户管理 app 内,那么就很古怪了。
进入项目根目录,执行下面的命令
python manage.py startapp 要创建的app名字
例如创建一个名为 sales 的 app
(hmsys) D:\PythonProject\hmsys\config>python manage.py startapp sales
点击 Pycharm 的 Tools ,选择 Run manager.py Task… 会弹出一个命令终端出来,在里面输入
startapp 要创建的 app 名字
例如:
startapp sales
这样就会创建一个目录名为 sales, 对应 一个名为 sales 的app
,里面包含了如下自动生成的文件。
sales/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
这个目录其实就是一个python package
里面有很多文件,后面会分别讲到它们的作用。
特别注意:无论是命令行 或 Pycharm 创建 app
时,在 settings.py
文件这里,都不会自动注册刚创建的 app
,需要自己手动添加
如:
当浏览器地址栏中输入网址访问的时候,服务端是如何让浏览器呈现出网页内容的?
是这样的: 当我们输入网址,比如百度网址,比较敲回车后,浏览器会发出http请求给百度的服务器,百度服务器返回 HTML 文档内容给浏览器, 浏览器解析后,呈现出我们最终看到的网页内容。
服务器返回的 HTML 文档内容其实就是 符合 HTML 语法的 一段字符串 而已。
我们现在使用 Django 开发后端服务, 就可以响应浏览器的http请求, 返回一段HTML字符串, 浏览器就可以呈现在界面上了。
刚才我们创建的 sales 应用里面 有个views.py
文件。 这个文件里面通常是写处理http 请求的代码的。
在这个文件内需要用到的 Django 的 http 模块
注意参数: request
如下例子所示:在 app 的 view.py 文件内创建 listorders()
函数
from django.http import HttpResponse
def listorders(request):
return HttpResponse("下面是系统中所有的订单信息。。。")
注意
这里面最终的返回结果是 HttpResponse
对象的参数字符串 ,也就是这句话
"下面是系统中所有的订单信息。。。"
listorders的参数 request
是 Django 中的 HttpRequest
对象,包含了HTTP请求中的信息。
后端程序处理请求,常常要根据请求中的数据进行相应的处理:
比如请求添加一个用户,那么HTTP请求消息中就会携带要添加用户的信息(姓名、登录账号等)
我们写后端的代码,这些信息就在 HttpRequest对象中获取。
所以这个参数非常重要。
HttpRequest 对象的属性和用法,具体可以参考官方文档这里
光是定义了这样一个函数不行的,我们需要 告诉 Django :
当前端发送过来的HTTP请求 url地址 是 /sales/orders/ , 就由 views.py
里面的函数 listorders
来处理怎么告诉Django呢?
这就是 Django中的 url路由设置。
前面在创建项目目录的时候,在项目的设置目录下,有如下的一个urls.py
文件
这个文件是 url
路由设置的入口文件
默认的 url 文件内容如下所示:
要真正的使用路由,向浏览器(客户端),返回服务器(服务端)的HttpResponse 一个响应数据
例如在一个名为 sales 的 app
内的 views.py
文件内,创建如下listorders()
函数
# sales app ——> views.py
from django.http import HttpResponse
def listorders(request):
return HttpResponse("下面是系统中所有的订单信息。。。")
# config ——> urls.py 主路由
from django.contrib import admin
from django.urls import path
# 别忘了导入 listorders 函数
from sales.views import listorders
urlpatterns = [
path('admin/', admin.site.urls),
# 添加如下的路由记录
path('sales/orders/', listorders),
]
就是告诉 当前端过来的请求 url地址 是 /sales/orders/ (注意:最后的一个斜杠不能省略) , 就由
views.py
里面的函数listorders
来处理。
所以,所谓 路由 就是指 : 根据 HTTP 请求的
url
路径, 设置 由哪个 函数来处理这个请求。
通常我们项目代码的修改, Django的测试服务可以自动检测到,并且重新加载,不需要我们重启 Django Web 服务。如果大家想重新启动 Django web 服务, 大家可以在启动web服务的命令行窗口,按ctrl + break(也就是Pause按钮)先停止服务。 然后再次运行启动命令。
我们这时,就可以登录浏览器输入网址 http://127.0.0.1/sales/orders/ (注意:最后的一个斜杠不能省略)
回车后,就会出现如下内容
上面的引用,我倒是不怎么清楚,会不会自动加载,不过一般而言我是比较建议,代码改了,还是要重启下比较舒服些。
在用 Pycharm 启动 config 项目后,点击蓝色 127.0.0.1:8000 ,会弹出一个报错,这是因为没有设置一个路由的问题,直接在 浏览器的 url 栏内输入 127.0.0.1:8000/sales/orders/
注意端口,需不需要加
还有发现其实可以这样输入的 127.0.0.1:8000/sales/orders
因为浏览器会自动补全 /
斜杠的
这就是浏览器的请求经过 Django路由后, 选择执行我们定义的函数
listorders
,该函数 返回的字符串,
被作为http响应的消息体中的内容返回给 浏览器(客户端)了。
所以浏览器(客户端)最终显示的就是 我们 listorders
函数返回的字符串。
注意:
只要修改了路由表配置,添加了我们自己的路由记录,再去浏览器访问 首页,这里就是 http://127.0.0.1 ,前面曾经出现的小火箭欢迎页就不见了! 会出现一个
404
Not Found 的报错页面。
这是正常的,小火箭欢迎页面 是Django在调试模式下,发现路由记录没有添加的时候,缺省作为首页的。
一旦路由记录发生变动, 就会消失。
urls.py 处理请求 requrest,views.py 返回请求处理结果 response。
url
路由表就是可以像上面这样,一个请求对应一个处理函数。
但是有的时候,我们的项目比较大的时候, 请求的 url
会特别多。
比如我们的系统提供给 客户、销售商、管理员 访问的 url
是不一样的,如下:
customer/
customer/orders/
sales/
sales/orders/
mgr/
mgr/customers/
mgr/medicines/
mgr/orders/
复杂的系统url
条目多达几百甚至上千个, 放在一个主路由表 urls.py
文件内,查看时,要找一条路由记录就非常麻烦。
这时,我们通常可以将不同的路由记录 按照功能 分拆到不同的 url 路由子表 文件中。—— app
文件夹内创建一个新的 urls.py
文件
比如,这里我们可以把 访问 的
url
凡是 以 sales 开头的全部都 由 salesapp
目录下面的 子路由文件urls.py
处理。首先我们需要在 sales 目录下面创建一个新的文件 sales\urls.py 。
Pycharm 创建 urls.py 文件:右键点击 app
名字,选择 New ,Python File
然后在这个 sales\urls.py 文件中输入如下内容
# sales ——> urls.py
# 导入 Django 的 urls 模块
from django.urls import path
# 先 sales.urls.py ——> 后 sales.views.py
# . 代表 当前 app 文件夹内,导入 views.py 文件
from . import views
urlpatterns = [
path('orders/', views.listorders),
]
然后,我们再修改主 url 路由文件 config/urls.py , 如下
# config ——> urls.py 主路由
from django.contrib import admin
# path 后导入一个include函数
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 凡是 url 以 sales/ 开头的,
# 都根据 sales.urls 里面的 sales app 的子路由表进行路由查询
path('sales/', include('sales.urls')),
]
当一个http请求过来时, Django检查
url
,比如这里是 sales/orders/,
先到主url路由文件 bysms/urls.py中查看 是否有匹配的路由项。如果有匹配 ( 这里匹配了 sales/ ), 并且匹配的对象 不是 函数, 而是 一个子路由设置 , 比如这里是 include(‘sales.urls’),就会去子路由文件中查看, 这里就是sales.urls
对应的文件 sales\urls.py 。注意这时,会从请求url中去掉 前面主路由文件 已经匹配上的部分
(这里是 sales/ 匹配到了则去掉), 将剩余的部分 (这里是 orders/)到子路由文件中——sales.urls.py
查看是否有匹配的路由项。这里就匹配了 orders/ ,匹配的对象,这里是views.listorders
,它是一个处理函数,就调用该函数处理该请求。
这个http请求, 将该函数的返回对象 构建 HTTP响应消息,返回给客户端。
我理解路由的重点在于:include() 和 函数,有 include 则 查询 对于 app 子路由文件 urls.py ,没有则执行指定的函数,处理请求
后端开发的本质上就是在传输图片、声音、视频、文本等等的数据,将它们序列化(也就是转变成 二进制 或者 说是字节码,这里转化的过程应该是用到了 Unicode 编码来对这些数据进行一个序列化,Unicode 编码 也被叫做 UTF-8 编码,注意这里的 8 指的是 8 bit (比特) ),这样序列化且转换成 Unicode 编码,可以方便传输数据。
因此,对于这些数据,自然也就是由后端开发来进行数据管理操作——增(INSERT
)、删(DELETE
)、查(SELECT
)、改(UPDATE
)
特别要注意的是:图片、声音、视频这类数据比较特殊,所以一般都是统称为资源文件,会单独放在一个单独的目录文件夹内,数据库不会将它们放在数据库里面的,数据库通常都是存储文本类的数据——如资源文件的文件地址(图片、声音、视频文件),其他的文本数据。
下面删除了之前演示的名为 sales 的 app
urls 路由删除
就目前来说,业界最广泛使用的数据库还是:关系型数据库。
关系型数据库系统,常用的开源数据库有 mysql
和 postgresql
。
建议大家实际工作中使用的时候,使用上面这两种。
如果觉得用MySQL
嫌麻烦的话,可以先看 Django框架默认数据库 sqlite 的相关教程:Django 默认的 sqlite 数据库
在文件内找到数据库配置,注释 sqlite 数据库默认配置 ,添加 MySQL 数据库的配置
# config.setting.py
# Database
# MySQL 数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 默认
'NAME': 'hmsys', # 连接的数据库名
'USER': 'root', # mysql的用户名
'PASSWORD': 'root@1234', # mysql的密码
'HOST': '127.0.0.1', # mysql的ip地址
'PORT': 3306, # mysql的端口
}
}
虽然配置文件配置好了,但是要想成功使用 MySQL 数据库,就需要安装 MySQL 的数据库引擎 ENGINE
,否则会报错。
这里需要使用命令行安装数据库引擎,用 Pycharm 安装挺麻烦的。
这里举例方便理解:进入我之前创建的虚拟环境 hmsys,输入如下命令:
pip3 install pymysql
然后在 Django 项目下的 init.py 文件内加入如下内容:
目前的示例项目为 config
# config.__init__.py
"""
setting中的配置默认为sqlite3数据库 当需要修改成MySql时
并且在setting.py的同级目录的__init__.py 加入如下配置
否则会报错: Error loading MySQLdb module.
"""
import pymysql
pymysql.install_as_MySQLdb()
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
# 默认 英文 格式
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # 设置为中文格式
# 默认时区
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' # 修改时区
USE_I18N = True
USE_L10N = True
# USE_TZ = True
USE_TZ = False # 可以被自定义转换
# 在用 MySQL 做数据库,且django设置 USE_TZ=True 时,
# 会遇到一个问题,就是按月份或日期筛选 model 数据时只能得到空集
链接:os.path.abspath用法
链接:关于 join 和 os.path.join 的理解
# 定义静态文件所在目录
STATIC_URL = '/static/'
# 报过错的位置 ##
STATIC_ROOT = os.path.join(BASE_DIR, '/static/')
# #
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"), # 绝对路径/static/
)
# 定义上传图片文件所在目录
# 此为指定上传的图片路径前缀
MEDIA_URL = "/media/"
# 绝对路径 /media/
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
报过的错:
ERRORS: ?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT settin
os.path.dirname用法
python中的os.path.dirname(file)的使用
静态文件配置参考链接
makemigrations # 先把 model 文件,建表的 SQL 语句整理出来
migrate # 之后连接数据库成功后,执行整理好的 SQL 语句
createsuperuser # 创建超级管理员账户
理解 Django 的 makemigrations 和 migrate
Django创建超级管理员
在 Pycharm 里面点击红色框内选项,在下方弹出界面输入 此三个 命令,等同于 python manage.py 命令
三条命令输入后:打开浏览器,在后面输入 admin/
就会弹出一个用户登录界面
用户密码,就是 createsuperuser
时配置的账号和密码,密码随意,只要到时 y
就行了,邮箱随意。
结果如下:
好了,Django 框架的基本使用方法,还有坑的总结就差不多这样了,后续会再补充下其他的。
END
Django开发