# django_day01
1、http 协议
超文本传输协议,HTTP有很多应用,但最著名的是用于web浏览器和web服务器之间的双工通信。
协议概述
HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络,
爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为
用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务
器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网
关或者隧道(tunnel)。
尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP
可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种
保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则
在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",
以及返回的内容,如请求的文件、错误消息、或者其它信息。
工作原理
以下是 HTTP 请求/响应的步骤:
1. 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,
http://www.luffycity.com。
2. 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求
数据4部分组成。
3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响
应头部、空行和响应数据4部分组成。
4. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若
connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5. 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为
若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并
在浏览器窗口中显示。
http请求方法
HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:
GET
向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例
如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,
使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请
求可能会创建新的资源或修改现有资源,或二者皆有。
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
注意: 方法名称是区别大小写的
HTTP状态码
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这一请求
4xx请求错误——请求含有词法错误或者无法被执行
5xx服务器错误——服务器在处理某个正确请求时发生错误
HTTP请求(request)格式
消息格式:
'请求方法 URL 协议版本
k1: v1
k2: v2
请求体'
HTTP响应(response)格式
消息格式:
协议版本 状态码 状态描述符
k1: v1
k2: v2
响应体(HTML页面)
2、 web 框架的原理
web 框架本质
我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。
这样我们就可以自己实现Web框架了。
服务器程序和应用程序
对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。
服务器程序负责对socket服务端进行封装,并在请求到来时,对请求的各种数据进行整理。
应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、
web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为
用户提供服务。
这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好
的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。
这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标
准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框
架也可以使用更多支持标准的服务器。
WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web
服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。
常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环
境用的就是这个模块来做服务器。
web框架
功能:
1. socket收发消息 服务器程序 uwsgi Gunicorn
应用程序
2. 根据不同的URL返回不同的页面(URL和函数对应关系)
3. 动态的页面(字符的替换)
python web的分类
Django 自己实现2,3 使用第三方的 开发阶段: wsgiref模块 部署:uwsgi
flask 自己实现了2
tornado 自己实现了1,2,3
分类:
1. Django
2. 其他
3、 Django (d不发音)
3. 下载Django
1. 命令行
pip3 install django==1.11.15
2. pycharm安装
4. 创建项目
1. 命令行
django-admin startproject 项目名
2. pycharm
5. 启动项目
1. 命令行
cd 项目目录下
python manage.py runserver # 127.0.0.1:8000
python manage.py runserver 80 # 127.0.0.1:80
python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80
2. pycharm
6. APP
创建APP
1. python manage.py startapp APP名字
注册APP
2. 在settings.py
INSTALLED_APPS = [
'app01',
'app02.apps.App02Config'
]
7. 路由系统(URL和函数的对应关系)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'index',views.index)
]
从上往下进行匹配
第一个参数是正则
8. 视图函数
1. request 封装了请求所有的东西
request.path_info ——》URL路径
request.method ——》请求方式
request.POST ——》POST提交的数据 { }
request.GET ——》URL上的参数 /login/?username=alex&passwor=123
2. 响应
新手必备三件套
1. HttpResponse('home') —— 返回一个字符串
2. render(request,'index.html') —— 返回一个具体的页面
3. redirect(跳转的URL) ——重定向 响应头 location:'跳转的地址'
9. 静态文件的配置
STATIC_URL = '/static/' # 别名 /static999/
STATICFILES_DIRS= [
os.path.join(BASE_DIR,'static')
]
10. ORM
1. pymysql连接数据库
1.import pymysql
2. 创建一个连接
3. 创建一个光标
4. 执行SQL语句
5. 得到sql的结果
6. 关闭光标
7. 关闭连接
2. ORM
1. 优点
不用写SQL
2. 缺点
1. 只能完成一部分操作
2. 效率低
3. 是什么?
对应关系
类 表
对象 记录
属性 字段
4. ORM的功能:
1. 操作数据表
2. 操作数据行
5. 使用ORM
1. 创建一个数据库
2. 配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 's22day18',
'USER': 'root',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}
3. 在项目同名的文件夹下的__init__.py中写代码:
import pymysql
pymysql.install_as_MySQLdb()
4. 在app下的models.py中写类:
class Publisher(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=16)
5. 执行数据库迁移的命令
python manage.py makemigrations # 保存APP下的models.py的变更记录
pyhton manage.py migrate # 将变更记录同步到数据库中
3. ORM操作
1. 查询
获取所有数据
models.Publisher.objects.all() —— 》 queryset 对象列表
获取满足条件的所有数据数据
models.Publisher.objects.filter(name='xxx') —— 》 queryset 对象列表
排序
models.Publisher.objects.all().order_by('id') —— 》 queryset 对象列表 升序
models.Publisher.objects.all().order_by('-id') —— 》 queryset 对象列表 降序序
获取一个对象
models.Publisher.objects.get(nid=1)
# 获取不到或者获取多个就报错
2. 增加
models.Publisher.objects.create(name='xxxxx') —— 》成功插入的对象
3. 删除
models.Publisher.objects.filter(nid=nid).delete() ——》 删除满足条件的所有对象
models.Publisher.objects.get(nid=nid).delete() ——》 删除对应的对象
4. 修改
pub_obj = models.Publisher.objects.get(nid=nid)
pub_obj.name = 'xxxx'
pub_obj.save() # 写入数据库
11. 模板语法
{{ 变量 }}
{{ pub_obj.name }}
{{ pub_obj.id }}
{% for i in pub_list %}
{{ forloop.counter }} # 当前循环的次数
<tr>{{ i }}</tr>
{% endfor %}