Python-手写web应用

一、web应用

1 用浏览器访问的应用程序
2 优点:
	-不需要客户端
    -更新直接在服务端更新,客户端感知不到
    -跨平台性好
3 缺点:
	-强调浏览器的适用性
	-用户的数据都保存在软件厂商那边,可能会被厂商泄露信息

二、b/s、c/s架构

1 b/s:浏览器---服务端(本质还是cs)
2 c/s:客户端---服务端

三、手写一个web应用

1 客户端是浏览器,服务端自己写(python)

2 静态页面,动态页面
-静态页面:静态的html,内容不会改变,每次访问看到的数据都一样
-动态页面:页面的数据会发生变化,每次访问看到的可能都不一样(数据来源可能是数据库)

3.1 main.py

# 1 写一个web应用的服务端,通过浏览器(客户端),来访问

import socket

server = socket.socket()

# server.bind(('127.0.0.1', 8080))
server.bind(('0.0.0.0', 8080))
server.listen(5)

while True:
    conn, addr = server.accept()
    # 接收浏览器传过来的数据
    data = conn.recv(1024)
    print(data)
    # 返回给浏览器数据(不符合http协议)
    conn.send(b'hello world')
    # 返回数据符合http协议
    conn.send(b'HTTP/1.1 200 ok 

 hello world')

    # 返回符合html格式的数据
    conn.send('HTTP/1.1 200 ok 

 <h1>title</h1>'.encode('utf-8'))

    ## 返回一个html页面,打开文件,转成二进制,send一下
    # with open('index.html','r',encoding='utf-8') as f:
    #     data=f.read()
    #
    # response='HTTP/1.1 200 ok 

 %s'%data
    # conn.send(response.encode('utf-8'))

    ## 实现动态页面
    # 在index.html中写一个特殊标记,使用python的变量去替换这个特殊标记,比如我们的标记是{{变量名}}
    import time
    ctime=time.time()  # 可能是数据库查询出来的
    with open('index.html','r',encoding='utf-8') as f:
        data=f.read().replace('{{time}}',str(ctime))
    response='HTTP/1.1 200 ok 

 %s'%data
    conn.send(response.encode('utf-8'))


    conn.close()

3.2 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{time}}
<br>
<br>

<img height="100" width="100" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1601009198247&di=b7b696110501b0e1ba3b5c508335c7b2&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201509%2F29%2F20150929213123_Mvy4S.jpeg" alt="">
</body>
</html>

四、http协议**

1 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网服务器与本地浏览器之间传输超文本的传送协议
2 HTTP协议是应用层的协议
3 http协议特性(记一下)

-1 基于tcp/ip之上的应用层协议
-2 基于请求-响应模式,即一个请求一个响应,无请求就不会有响应
-3 无状态保存,对于双方来说,都是一次性交易,下一次又都不认识了,因为这个缺陷所以出现了cookie和session技术
-4 无连接,无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

浏览器发送的请求,默认是访问80端口

4 请求协议(浏览器发出来的)(记住)
三部分:请求首行,请求头,请求体

'''
1.请求首行(以第一个
区分的),包括请求方式,请求地址,协议,版本
GET /lqz/handsome HTTP/1.1

对应关系:
请求方式:GET  请求地址:/lqz/handsome   协议:http   版本:1.1版本


2.请求头(key:value形式)
Host: 192.168.11.211:8080

Connection: keep-alive

Cache-Control: max-age=0

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9

'

3.下面的是请求体的内容


  
'''

5 响应协议

'''
1.响应首行
响应协议和版本:HTTP/1.1  响应的状态码和标志:200 ok  
HTTP/1.1 200 ok 

2.响应头(key:value形式)
key:value
key:valu




3.响应体:在浏览器里看到的东西(浏览器能把下面的html渲染成好看的样子)
<!DOCTYPE html>
<html lang="en">
<h1>hello</h1>
</html>
'''

6 响应状态码
	-1xx:请求正在处理(用户一般看不到)        
    -2xx:请求成功(200)
    -3xx:重定向(301  302)访问一个地址,转到另一个地址
    -4xx:客户端错误(404,403)
    -5xx:服务端错误(502)


 7 url:统一资源定位符
	# 格式
    http://127.0.0.1:8080/order.html
    ftp://xxx
    协议://IP:端口(80)/路径?name=lqz&age=18
    统一资源定位符是可以从互联网上访问资源的一种方式,协议就是资源的地址

6 响应状态码(要记一些常用的,后面会整理出来)

-1xx:请求正在处理(用户一般看不到)        
-2xx:请求成功(200)
-3xx:重定向(301  302)访问一个地址,转到另一个地址
-4xx:客户端错误(404,403)
-5xx:服务端错误(502)

7 url:统一资源定位符

# 格式
http://127.0.0.1:8080/order.html
ftp://xxx
协议://IP:端口(80)/路径?name=lqz&age=18
统一资源定位符是可以从互联网上访问资源的一种方式,协议就是资源的地址

五、web框架

web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。
说白了就是他人把一些基本功能写好了,我们可以在此基础上二次开发,一些通用的基础功能都已经被实现了不需要重复写。比如我们处理socket,这种重复代码就已经被封装好了。每种编程语言都会有web框架

原文地址:https://www.cnblogs.com/chiyun/p/14066031.html