django简介
Web开发的早期阶段,开发者需要手动编写每个页面,例如一个新闻门户网站,每天都要修改它的HTML页面,随着网站规模和体量的增大,这种方式就变得极度糟糕。为了解决这个问题,开发人员想到了用外部程序来为Web服务器生成动态内容,也就是说HTML页面以及页面中的动态内容不再通过手动编写而是通过程序自动生成。最早的时候,这项技术被称为CGI(公共网关接口),当然随着时间的推移,CGI暴露出的问题也越来越多,例如大量重复的样板代码,总体性能较为低下等,因此在时代呼唤新英雄的背景下,PHP、ASP、JSP这类Web应用开发技术在上世纪90年代中后期如雨后春笋般涌现。通常我们说的Web应用是指通过浏览器来访问网络资源的应用程序,因为浏览器的普及性以及易用性,Web应用使用起来方便简单,免除了安装和更新应用程序带来的麻烦,而且也不用关心用户到底用的是什么操作系统,甚至不用区分是PC端还是移动端。
1.1 术语
解释 | 术语 |
---|---|
统一资源定位符/统一资源标识符,网络资源的唯一标识 | URL/URI |
与Web服务器地址对应的一个易于记忆的字符串名字 | 域名 |
域名解析服务,可以将域名转换成对应的IP地址 | DNS |
网络上的主机的身份标识,通过IP地址可以区分不同的主机 | IP地址 |
超文本传输协议,构建在TCP之上的应用级协议,万维网数据通信的基础 | HTTP |
代理客户端向服务器发出请求,然后将服务器返回的资源返回给客户端 | 反向代理 |
接受HTTP请求,然后返回HTML文件、纯文本文件、图像等资源给请求者 | Web服务器 |
高性能的Web服务器,也可以用作反向代理,负载均衡 和 HTTP缓存 | Nginx |
HTTP请求(请求行+请求头+空行+[消息体]):
HTTP响应(响应行+响应头+空行+消息体):
Python的Web框架有上百个,没有Web框架,我们仍然可以通过socket或CGI来开发Web服务器端应用Web框架中比较有名的有:Flask、Django、Tornado、Sanic、Pyramid、Bottle、Web2py、web.py等。
Django对MVC架构提供了支持(MTV)
1.2 准备工作
检查Python环境$ python3 --version
创建项目文件夹并切换到该目录$ mkdir oa /cd oa
创建并激活虚拟环境 source venv/bin/activate 对每个包不兼容,安装虚拟环境django
更新包管理工具pip。(venv)$ python -m pip install -U pip
安装Django。(venv)$ pip install django==2.1.8
检查Django的版本。(venv) django-admin --version
使用django-admin
创建项目,项目命名为oa (venv)$ django-admin startproject oa . 点它表示在当前路径下创建项目。
注意:上面的命令最后的那个点,它表示在当前路径下创建项目。
执行上面的命令后看看生成的文件和文件夹,它们的作用如下所示:
manage.py
: 一个让你用各种方式管理 Django 项目的命令行工具。oa/__init__.py
:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。oa/settings.py
:Django 项目的配置文件。oa/urls.py
:Django 项目的 URL 声明,就像你网站的“目录”。-
oa/wsgi.py
:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。启动服务器运行项目。(venv)$ python manage.py runserver
说明
刚刚启动的是Django自带的用于开发和测试的服务器,它是一个用纯Python编写的轻量级Web服务器,但它并不是真正意义上的生产级别的服务器,千万不要将这个服务器用于和生产环境相关的任何地方。
说明2:用于开发的服务器在需要的情况下会对每一次的访问请求重新载入一遍Python代码。所以你不需要为了让修改的代码生效而频繁的重新启动服务器。然而,一些动作,比如添加新文件,将不会触发自动重新加载,这时你得自己手动重启服务器。
说明3:可以通过
python manage.py help
命令查看可用命令列表;在启动服务器时,也可以通过python manage.py runserver 1.2.3.4:5678
来指定绑定的IP地址和端口。说明4:可以通过Ctrl+C来终止服务器的运行。
修改项目的配置文件settings.py (venv)$ vim oa/settings.py
python manage.py startapp poll
<pre class="md-fences md-end-block" lang="" contenteditable="false" cid="c99" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: monospace, monospace; font-size: 0.9em; white-space: pre; display: block; break-inside: avoid; text-align: left; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;"># 设置语言代码
LANGUAGE_CODE = 'zh-hans'设置时区
TIME_ZONE = 'Asia/Chongqing'</pre>
1.4 动态页面
修改应用目录下的视图文件views.py。
<pre class="md-fences md-end-block" lang="" contenteditable="false" cid="c103" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: monospace, monospace; font-size: 0.9em; white-space: pre; display: block; break-inside: avoid; text-align: left; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">
(venv)$ vim hrs/views.py
from django.http import HttpResponse</pre>
def index(request):
<pre class="md-fences md-end-block" lang="" contenteditable="false" cid="c105" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: monospace, monospace; font-size: 0.9em; white-space: pre; display: block; break-inside: avoid; text-align: left; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">
return HttpResponse('<h1>Hello, Django!</h1>')</pre>
<pre class="md-fences md-end-block" lang="" contenteditable="false" cid="c107" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: monospace, monospace; font-size: 0.9em; white-space: pre; display: block; break-inside: avoid; text-align: left; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">
修改该目录下的urls.py</pre>
from django.contrib import admin from django.urls import path, include
urlpatterns = [
<pre class="md-fences md-end-block" lang="" contenteditable="false" cid="c112" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: monospace, monospace; font-size: 0.9em; white-space: pre; display: block; break-inside: avoid; text-align: left; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">
path('admin/', admin.site.urls),
path('hrs/', include('hrs.urls')),</pre>
]
<pre class="md-fences md-end-block" lang="" contenteditable="false" cid="c115" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: monospace, monospace; font-size: 0.9em; white-space: pre; display: block; break-inside: avoid; text-align: left; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">
</pre>