目录
web应用的本质
web的本质:请求,处理,响应
socket网络编程
架构:C/S架构
TCP/UDP协议
传输层
web应用
架构:B/S架构
协议:http协议
应用层
字符串转字节:bytes('aaaa',encoding='utf8')
字节转字符串:str(res,encoding='utf8')
web框架本质
对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端
import socket
def handle_request(client):
data = client.recv(1024)
client.send(bytes("HTTP/1.1 200 OK
", encoding='utf-8'))
client.send(bytes('aaa',encoding='utf8'))
def main():
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('127.0.0.1',8000))
sock.listen(5)
while True:
conn,add = sock.accept()
handle_request(conn)
conn.close()
if __name__ == '__main__':
main()
HTTP协议
请求
由三部分组成:请求行,请求头,请求体
请求头后面会有一个换行,然后是请求体
请求行
请求方法,页面地址,协议版本
GET/BOOK/JAVA.HTML HTTP/1.1
请求头
由key/value 组成,告诉服务端需要的资源类型。
Accept:用于告诉服务器,客户机支持的数据类型 (例如:Accept:text/html,image/*)
Accept-Charset:用于告诉服务器,客户机采用的编码格式
Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式
Accept-Language:客户机语言环境
Host:客户机通过这个服务器,想访问的主机名
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间
Referer:客户机通过这个头告诉服务器,它(客户端)是从哪个资源来访问服务器的(防盗链)
User-Agent:客户机通过这个头告诉服务器,客户机的软件环境(操作系统,浏览器版本等)
Cookie:客户机通过这个头,将Coockie信息带给服务器
Connection:告诉服务器,请求完成后,是否保持连接
Date:告诉服务器,当前请求的时间
请求体
包括请求的一些数据
get请求通过url给服务器传值,post请求通过表单给服务器传值
name=dylan&id=110
响应
由三部分组成:响应行,响应头,响应体
响应行
协议版本,响应状态,响应结果
HTTP/1.1 200 OK
响应头
Location:这个头配合302状态吗,用于告诉客户端找谁
Server:服务器通过这个头,告诉浏览器服务器的类型
Content-Encoding:告诉浏览器,服务器的数据压缩格式
Content-Length:告诉浏览器,回送数据的长度
Content-Type:告诉浏览器,回送数据的类型
Last-Modified:告诉浏览器当前资源缓存时间
Refresh:告诉浏览器,隔多长时间刷新
Content-Disposition:告诉浏览器以下载的方式打开数据。例如: context.Response.AddHeader("Content-Disposition","attachment:filename=aa.jpg"); context.Response.WriteFile("aa.jpg");
Transfer-Encoding:告诉浏览器,传送数据的编码格式
ETag:缓存相关的头(可以做到实时更新)
Expries:告诉浏览器回送的资源缓存多长时间。如果是-1或者0,表示不缓存
Cache-Control:控制浏览器不要缓存数据 no-cache
Pragma:控制浏览器不要缓存数据 no-cache
Connection:响应完成后,是否断开连接。 close/Keep-Alive
Date:告诉浏览器,服务器响应时间
响应体
包含浏览器能够解析的静态内容,例如:html,纯文本,图片等等信息
"hello world"
django的安装和启动
安装方法
pip install django1.11.22(前后不要有空格)
pycharm安装
django的创建
django-admin startproject 项目名
ps:项目名不要有括号和特殊字符
pycharm创建
需要的操作
到settings.py中, 配置:
1. STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
逗号不能少
static目录需要创建
2. MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
3. 'DIRS': [os.path.join(BASE_DIR, 'templates')]
django目录结构
s9day54:
s9day54:
settings.py: 配置文件
urls.py: 路由映射关系
wsgi.py : socket服务端文件
static:(自创)
css
js
img
templates:
html模版
manage.py: 管理文件
django服务
pycharm启动
django的路由介绍
添加路由和函数的对应关系:
在urls.py文件中操作
return HttpResponse:它是作用是内部传入一个字符串参数,然后发给浏览器
from django.shortcuts import HttpResponse
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^index/', index),
]
def index(request):
return HttpResponse('index')
django连接数据库操作
pymsql连接
连接数据库的函数写在urls.py文件中
from django.shortcuts import HttpResponse,render
def index(request):
return HttpResponse('index')
def h1(request):
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = 'admin123',
database = 'django0807'
)
course = conn.cursor(pymysql.cursors.DictCursor)
sql = 'select * from student'
course.execute(sql)
data = course.fetchall()
return render(request,'h1.html',{"data":data})
从数据库中获取的数据是以字典形式传到html页面中,在html页面中遍历字典,最后显示在页面
{% for i in data %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.name }}</td>
<td>{{ i.age }}</td>
<td>{{ i.class_id }}</td>
{% endfor %}