史上最全——手把手开发Django网站建设
手把手开发Django网站建设
1、基础知识
1.1 HTTP协议
HTTP是一个基于“请求与相应”模式的、无状态的应用层协议。
HTTP协议是采用URL作为定位网络资源的标识。
格式:http://host:[port]/[path]
其中,
host
:合法的Internet主机域名或IP地址。
port
:端口号,缺省端口为80。
path
:请求资源的路径。
1.2 HTTP协议对应的操作
方法 | 说明 |
---|---|
GET | 获取URL位置的资源 |
HEAD | 获取URL位置资源的响应消息报告,即获得资源的头部信息 |
PUT | 请求像URL位置储存一个资源,覆盖原有URL位置的资源 |
POST | 向指定URL位置的资源后附加新的数据 |
PATCH | 请求局部跟新URL位置的资源,覆盖原URL位置的资源 |
DELETE | 删除URL处指定的资源 |
1.3 Web服务器
Web服务器(Web Server)是软件工具。
Web服务器用于提供HTTP\HTTPS的网络访问服务。
Web服务器很成熟,只需要配置,不需要开发。
常用的Web服务器有:
- Apatch(a patchy server):是Apache软件基金会的一个开放源码的网页服务器。
- Nginx(engine x):是一款高性能的HTTP和反向代理web服务器。
- Node.js:是一个基于Chrome V8的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O的模型。
- Tomcat:Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
- IIS(Internet Information Services):由微软公司提供的基于运行Microsoft Windows的互联网基本服务
- BEA Weblogic:美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
2、Django框架基础
2.1 Django的理解
- Django是一个Web框架。
- Django是一个产品级框架,支持全球近万个云端网络。
- Django采用MTV(Model-Template-View)模型组织。
- 和其他框架相比,Django充分利用Python的特点,开发效率高。
2.2 Django Web框架
2.3 开发Django开发的最小程序
开发web框架的最小程序单元:
step1: 新建一个Web框架程序。
确定好具体的文件路径,然后: django-admin startproject myhtml
,此时会创建以下内容:
myhtml/
# 外层根目录文件,名字可以改。mysite/
# 工程目录,保存代码和文件。
__init__.py
:# 一个将mysite定义为包的空文件。urls.py
:URL路由的声明文件(路由文件)setting.py
:部署和配置整个工程的配置文件(配置文件)wsgi.py
:基于WSGI的Web服务器的配置文件。manage.py
:一个与Django工程进行交互的命令工具。
step2:修改并添加功能
python manage.py startapp myapp
通过此条命令增加新的功能。
step2.1:创建一个具体的应用(app)。
step2.2:修改views.py:对URL的具体响应功能。
step2.3:修改URL路由:指定URL与响应之间的关系。
step3:调试运行Web框架(在myhtml工程目录下)
python manage.py myhtml
三种Django的运行管理方式:
django-admin <command> [options]
python manage.py <command> [options]
python -m django <command> [options]
框架和功能的区别
工程(project)和应用(app)的关系:
- 工程对于一个网站是应用于配置的集合。
- 应用对应与特定的功能,是具体功能的载体。
- 配置和功能分离是高度模块化的体现。
2.4 MTV开发模式
2.4.1 MTV开发框架
M:Models模型
V:Views视图
T:Templates模板
2.4.2 MTV开发模式——Web框架
3. 通过web框架搭建一个最简易的程序:
第一步:新建一个web框架程序
- 通过
CMD
进入到想要创建web程序的文件夹 - 数据命令
django-admin startproject yourhtml
第二步:修改并添加功能
- 创建一个具体的功能程序(app),代码如下
python manage.py startapp yourapp
- 修改
yourapp
中的views.py(如果没有就创建),并输入以下代码:
from django.shortcuts import render
def hello(request):
return render(request, '你想要展示的html')
这里需要说明的是:需要手动在你的
yourapp
文件夹下创建templates
文件夹,然后放入你想要展示的文件
- 在
yourapp
中,新增urls.app
文件(本地路由文件),并且输入以下内容:
from django.urls import path
from . import views
urlpatterns = [
path('', views.hello)
]
- 在全局路由文件
yourhtml
中的urls.py
增加对应本应用的路由文件引用
from django.contrib import admin
from django.urls import include, path
from yourapp import views # 这里是你的功能文件的函数
urlpatterns = [
path(r'', include('yourapp.urls')),
path(r'', admin.site.urls),
这里有个坑就是,在
path
中第一个参数urls
设置的时候需要置空,否则会报错。
- 设置模板路径,让Django框架能够找到模板对应目录
TEMPLATES = [
{
'DIRS':[os.path.join(BASE_DIR, 'yourapp/templates')],
}
]
第三步 调试运行程序
CMD
到根目录(yourhtml)下,运行:
python manage.py runserver
会自动弹出网页,或者点击http://127.0.0.1:8000/
也可以生成网页。
4、Django框架进阶内容
这一单元需要对Django的整个框架搭建有一个深入的了解。看完本章内容,你将收获:
- URL路由的机制。
- Views视图的类型。
- Views视图中流式相应机制。
- Django的模板引擎和模板使用
- Django模板语言入门。
4.1 URL路由的机制
4.1.1 Django的URL路由配置
- 路由是关联URL及其处理函数关系的过程。
创建的settings.py
中通过ROOT_URLCONF
变量指定全局路由文件名称,一般路由名称与工程名称相同。 - Django使用
urlpatterns
变量名来添加路由,改变量是列表类型,一般有path
和re_path
组成。
4.1.2 Django的URL路由流程
注意:Django的路由不考虑HTTP请求方式,仅根据URL进行路由,即只要路由路径相同,无论POST、GET等哪种请求方式都指向同一个操作函数。
4.1.3 path(route, view, kwargs=None, name)
- route:表示url或者url模式,Django定义的url转换语法
- view:处理(视图)函数的名称,包含include函数
- kwargs:关键字参数,向处理函数提供额外的参数,以字典的形式表示
- name:给path确定一个具体的名字
4.1.3.1 route的url格式转换
类型 | 说明 | 示例 |
---|---|---|
精确字符串格式 | 常规的路径结构。 | dir1/dir2 |
Django转换格式 | 通过不同参数控制路径,可以将路径保存。 | dir1/<str:name> |
正则表达式 | 通过正则表达式控制路径。 | dir1/(?P<dir>[0-9]{1} |
1) 精确字符串格式
- 适合静态单一的路径;
- 一个url匹配一个路径;
- url不用以/开头,但是要用/结尾;
2) Django转换格式
- 一个url模板,匹配一批url的同时,能够获得一批变量名作为参数。
- 常用形式,目的是通过url进行参数传递和获取。
- 采用<类型:变量名>的形式获取参数。
3)正则表达式
使用re_path函数,两种具体形式:
- 简单的(pattern),不提取参数:
path/([0-9]{4})/
- 命名模式的(pattern),提取参数,统一为str类型:
path/?P<name>[0-9]{4}
4.1.3.2 view的使用
- 处理函数:
views.py
处理函数,是url 的最终归宿。
2)include处理函数:include(other.urls)
包含其他文件的url路径。有两重作用:
① 附加本地路由。
② 路径去重。
为了避免系统找不到url,可以进行如下设置:
urlpatterns = [
path('',<根目录路径>)
re_path('^$',<跟目录路径>)
# 二选一即可
4.2 视图相应函数
视图函数接收HTTP请求并相应,可以放在任何地方,可以是任何功能。
- 视图函数可以返回web文本、重定向、页面、请求、图片等任何内容。
- 视图函数通过HttpResponse、JsonResponse等类表达并返回响应。
- 视图函数一般放在对应app中的
views.py
中。
Django的相应类型:
- HttpResponse类及子类
- JsonResponse类
- StreamingHttpResponse类
- FileResponse类
- Render类
下面对这五类分别进行阐述:
4.2.1 HttpResponse类及子类
1. HttpResponse响应一览表
编码 | 定义 | 描述 |
---|---|---|
200 | HttpResponse | 常规响应,表示正常 |
301 | HttpResponsePermanentRedirect | 永久重定向 |
302 | HttpResponseRedirect | 访问重定向 |
304 | HttpResponseNotModified | 网页未发生变化 |
400 | HttpResponseBadRequest | 不良响应 |
403 | HttpResponseForbidden | 禁止访问 |
404 | HttpResponseNotFound | 网页丢失 |
405 | HttpResponseNotAllowed | 响应不被允许 |
410 | HttpResponseGone | 网页丢失 |
500 | HttpResponseServerError | 服务器错误 |
2. HttpResponse响应格式
HttpResponse(content, content_type=None,\
status=200, charset=None)
其中
content
:拟返回的字符串content_type
:MIME格式的返回内容类型status
:响应的状态码char_set
:响应的字符集
3. HttpResponse 示例
# 在框架的url中增加HttpResponse函数对应的路径
# 这个是yourhtml下的urls
from yourapp import views as yourappviews
urlpatterns = [
path('', yourappviews.func)
]
# 在yourapp中的views增加对应的func
from django.http import HttpResponse
def func(request):
response = HttpResponse()
response.write('do something now.') # 这里会生成一个新的网页。
4.2.2 JsonResponse类及子类
1. JsonResponse结构
JsonResponse(data)
:主要用于数据类型的相应,其中:
data是{key:value}
的字典键值对,返回Json的数据格式。
2. JsonResponse示例
from django.http import JsonResponse
def func(request):
Response= JsonResponse({
'key':'value'})
return response
Django下载文件最优的两种方法
4.2.3 StreamingHttpResponse类及子类
1. StreamingHttpResponse结构
StreamingHttpResponse(streaming_content)
:流式相应,内容的迭代器形式,以内容流的方式响应。
注:
StreamingHttpResponse
一般多现实在页面上,不提供下载。
以下为示例代码
def streamDownload(resquest):
def file_iterator(filepath, chunk_size = 512):
with open(filepath, 'rb') as f:
while True:
con = f.read(512)
if con:
yield con
else:
break
filename = os.path.abspath(__file__) + 'test.txt'
response = StreamingHttpResponse(file_iterator(filename)
return response
# 最后程序会将结果打印在显示器上
4.2.4 FileResponse结构类及子类
FileResponse(stream)
:以流形式打开后的文件
FileResponse
是StreamingHttpResponse
的子类
def homeproc2(request):
cwd = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
response = FileResponse(open(cwd + "/msgapp/templates/youfile", "rb"))
response['Content-Type'] = 'application/octet-stream'
response['COntent-Disposition'] = 'attachment;filename="filename"'
return response
需要解释说明的是:
response['Content-Type'] = 'application/octet-stream'
response['COntent-Disposition'] = 'attachment;filename="filename"'
Content-Type
:用于指定文件类型。
COntent-Disposition
:用于指定下载文件的默认名称,对,没错! “CO”两个字符都要大写。
两者都是MIME协议里面的标准类型。
4.2.5 Render 类及子类
开发一个网页,如何“跨”多级MVC的类,如何变静态网页为***页,如何将自己的上下文组合成内容再返回到网页前端?
——此时就需要render()
函数了。
1 render函数结构
render(request, template_name, context=None, content_type=None, status=None, using=None)
必选参数
request
:用于生成相应的请求对象。template_name
:要使用的模板的全名或者模板的序列。如果给定了一个列表,则选择存在的第一个模板。可选参数
context
:表示要添加到模板上下文的值的字典。默认情况下,是一个空的字典,如果字典是可调用的,则视图将在渲染模板前调用它。content_type
:用于结果文档MIME类型默认为:setting配置文件:DEFAULT_CONTENT_TYPE
的值。status
:默认相应为200。using
:用于加载模块的模块引擎:setting配置文件:NAME
2 render函数示例
from django.shortcuts import render
def my_view(request):
return render(request, 'my_app\index.html', {
'foo':'bar'}, content_type='application\xhtml+xml)
↓↓↓相当于以下内容↓↓↓
from django.http import HttpResponse
from django.template import loader
def my_view(request):
t = loader.get_template("my_app\index.html")
c = {
"foo":"bar"}
return HttpResponse(t.render(request, c), content_type='application\xhtml+xml')
5、数据库的使用
Django通过自带的ORM框架操作数据库,可以支持自带的sqlite3数据库。
5.1 数据库使用流程
5.1.1 配置sqlite3数据库环境
step1:配置sitting.py
中的INSTALLED_APPS
增加webserver_1
需要让Django明白给那个app建表
step2:配置sitting.py
中的DATABASE
中的ENGINE
和NAME
函数,默认为sqlite3
数据库。
5.1.2 编辑sqlite3数据库
一般将数据库的便捷放在Model中。
编辑
MTV
中的M
,编辑models.py
文件,在model.py中建立需要采集的数据字段。
5.1.3 操作sqlite3数据库
两个命令后+业务逻辑
命令1:python manage.py makemigration
创建数据库表,如下图所示:
命令2:python manage.py migrate
迁移数据文件,生成了db.sqlite3文件,看不懂有什么具体的作用。
修改业务逻辑:
- 将获取到的数据保存到数据库中。
models.UserInfo.objects.create(user=username, password=password
- 然后获取数据库中的数据内容。
models.UserInfo.objects.all()
具体的内容如下:
这样,重启web服务器后,刷新浏览器页面,所有的数据都可以保存到相应的数据库中。任何时候都可以从数据库中读取相应的数据内容,然后展示到相应的数据页面上啦。
到此,一个框架完整,要素齐全的Django项目就完成啦!