初识Django
首先,我们应该大概知道Django是一种框架,可是框架又是什么呢?
简单来说,框架的本质就是一系列功能的集合体,可以把不同的功能放在不同的文件中,有了框架,可以让我们写项目的整个周期大幅度缩短,效率极大提高,一个成熟合适的框架更是可以实现很多我们无法实现的功能.
那么在介绍Django之前,我们先了解一下其底层原理,或者说其由来.
HTTP协议简介
在之前我们了解过C/S架构和B/S架构,C/S架构就是客户端和服务端之间的交互,而B/S架构则是浏览器和服务端之间的交互,而我们所写的web端,其实就是C/S架构,即服务端和浏览器进行交互,那么浏览器为了理解服务端返回来的消息,就要遵循一种协议,或者说一种数据格式,就是HTTP协议,全程超文本传输协议.
HTTP的四大特性
如下:
- HTTP是基于TCP/IP上的作用于应用层的协议,这是其应用领域
- HTTP是基于请求响应的
- HTTP本身是无状态的,无状态的意思是协议本身不会保存用户的任何信息和状态,每次用户发过来的请求都会当做第一次来处理,所以为了解决这个问题我们加入了cookie和session这么一些键值对来解决用户状态的保存问题.
- HTTP是无连接的,无连接的概念就是,浏览器在和服务端连接上之后,并不是一直保持这个链接,或者说,本来就没有链接,只是发一次数据而已,对于需要长连接的的服务端和浏览器,我们通常会借用webstock来创建一个长连接,从而解决无连接的问题,webstock通常称为HTTP协议的一个大补丁,比如我们通常用的一些聊天软件,会用过这个模块来解决.
C/S架构下的数据格式
请求的格式:
- 请求首行(包括请求方式method以及协议版本,也就是HTTP的版本)
- 请求头,很长,且均为键值对的形式.
accept:浏览器通过这个头告诉服务器,它所支持的数据类型
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Host:浏览器通过这个头告诉服务器,想访问哪台主机
If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接 - 空格,(
- 请求体,顾名思义,请求体就是发请求的浏览器真正发的内容,对,上面那么多都不是正式内容,只有请求体里面的才是真正发送的内容.
响应的格式和请求的完全一样,这里不再赘述.
HTTP常见的响应状态码
-
1XX:服务端已经成功接收到你的数据,正在处理,你可以继续提交其他数据
-
2XX Success(成功状态码):
200 服务端成功响应客户端发来的消息
204 表示服务端接收的请求已经被成功处理,但是在返回的响应报文中不含实体的主体部分
-
3XX Redirection(重定向状态码):
301 永久性重定向
302 临时性重定向
-
4XX Client Error(客户端错误状态码)
400 表示请求报文中存在语法错误
401 表示发送的请求需要有通过HTTP认证的认证信息
403 表示对请求资源的访问被服务器拒绝了
404 服务器上无法找到请求的资源,是我们最常见的报错
-
5XX Server Error(服务器内部错误状态码)
500 表示服务端在执行请求的时候发生了错误
503 表示服务器暂时处于超负载或者正在进行停机维护,无法处理请求
web框架的简单实现
下面我们就用已有的知识来简单实现一个web框架,也就是一个简单的山寨版Django,下面的例程实现了在浏览器访问服务端的时候可以看到请求发送的时间.
# 服务端
import socket
def make_server(ip, port, app): # 代表server
sock = socket.socket()
sock.bind((ip, port))
sock.listen(5)
print('Starting development server at http://%s:%s/' %(ip,port))
while True:
conn, addr = sock.accept()
recv_data = conn.recv(1024) # 接收到的是整个请求报文,是字符串格式
ll=recv_data.decode('utf-8').split('
') # 解码请求头,并以换行符为关键字切割请求头
head_ll=ll[0].split(' ') # 以换行符切割之后取列表的第一位,然后以空格为关键字切割,得到请求首行
environ={}
environ['PATH_INFO']=head_ll[1] # 请求首行分成了两部分,第一个是请求方式,第二个是协议版本
environ['method']=head_ll[0]
res = app(environ)
conn.send(b'HTTP/1.1 200 OK
') # 服务端发送响应报文的时候,这是报文首行
conn.send(b'Content-Type: text/html
')
conn.send(res)
conn.close()
def app(environ):
# 处理业务逻辑
with open('timer.html', 'r', encoding='utf-8') as f:
data = f.read()
import time
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
data = data.replace('{{ time }}', now) # 字符串替换
return data.encode('utf-8')
if __name__ == '__main__':
make_server('127.0.0.1', 8008, app) # 在浏览器输入http://127.0.0.1:8008,每次刷新都会看到不同的时间
Python的主流web框架
Python中常用的web框架大概有三种,即Django,Flask以及Tornago,下面简单介绍一下这三者的区别.
1. Django
是Python里面最全能的开发框架,Django的MVT架构,自带ORM,虽然存取速度略慢,但还是给开发者提供了极大的便利,提高开发者的开发效率.
要实在要挑出其缺点,大概也就是整体程序太大,不易移植这么一个缺点了.
2. Flask
小而精,自带的功能特别少,但是其第三方的模块特别多,也就是说其扩展性非常强,如果将flask第三方模块全部加起来,完全可以超过Django,也就是因为比较依赖于第三方模块,如果第三方模块停止更新的话,可能会出现一系列问题
3. Tornado
可以实现高并发,高性能的框架,一句话总结就是异步非阻塞.
Django的安装
上面我们完成了对Django的大致铺垫,下面介绍Django的安装和使用以及一些注意事项.
Django安装非常简单,一句话,打开cmd窗口,输入
pip install django==版本号
关于django 的版本号,市面上用的最多的还是1.XX版本的,不过版本是在一直更新的,所以我们也要于是俱进,具体用哪个版本看个人项目需求,区别不是特别大,可以接受.版本发行时间图如下
安装成功之后,我们可以用这个命令来查看当前安装的Django
django-admin
只要这个命令出来一大串指令,而不是直接报错,就说明你已经安装成功了.
Django的创建
Django项目的创建通常有两种,即Pycharm创建和命令行创建
命令行式
django-admin startproject mysite 创建一个名为mysite的项目
python manage.py runserver 8010 运行该项目在8010端口,后面端口不写的话默认是8000
python manage.py startapp app01(应用名,尽量和功能名对应) 可以创建一个app
* 要注意!创建的应用一定要去settings.py文件中注册
Pycharm创建Django项目
直接new项目,选择Django即可
命令行创建:
templates文件夹没有,需要手动创建
settings.py文件里需要手动配置templates的路径
pycharm创建:
自动帮你创建templates文件夹和路径配置
也能自动创建一个app并且自动注册
Django项目的路径和大致结构
项目名
跟项目名同名的文件夹
__init__.py
settings.py
urls.py
wsgi.py
manage.py文件