开发者学堂课程【Python入门 2020年版:根据不同的请求返回不同的内容】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10480
根据不同的请求返回不同的内容
1.代码:
import socket
server_socket=socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
server_socket.bind((
‘0.0.0.0’,8090))
server_socket.listen(128)
while True
:
client_socket,client_addr=server_socket.accept()
data=client_socket.recv(1024).decode(
‘utf8’)
print
(‘接收到{}的数据{}’.format(client_addr[0],data))
client_socket.send(
‘HTTP/1.1 200 OK\n’.encode(‘utf8’))
client_socket.send(
‘content-type:text/html’.encode(‘utf8’))
client_socket.send(‘\n’.encode(‘utf8’))
client_socket.send(
‘<h1 style=“color:red”>hello world</h1>.encode(‘utf8’))
我现在做一个功能,先把服务器运行起来,然后访问:localhost:8090/register,这是注册的路径,现在想在页面上显示“欢迎来到注册页面”,在:localhost:8090/login,显示登录。
2.写个响应头:
import socket
server_socket=socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
server_socket.bind((
‘0.0.0.0’,8090))
server_socket.listen(128)
while True
:
client_socket,client_addr=server_socket.accept()
data=client_socket.recv(1024).decode(
‘utf8’)
print(
‘接收到{}的数据{}’.format(client_addr[0],data))
#响应头
response_ header = 'HTTP/1.1 200 OK\n' + ' content-type:text/html\n'
response_ header += '\n'
或者直接写成response_ header = 'HTTP/1.1 200 OK\n' + ' content-type:text/html\n\n'
#响应体
response_body=’hello world’
#响应
response=response_header+response_body
#发送给客户端
client_ socket.send(response .encode('utf8'))
运行访问:localhost:8090/register,出现hello world
访问:localhost:8090/login,出现hello world
但是现在要求根据不同的响应,返回不同的内容。这时怎么做“response_body”
就不能写死,响应体要拼一下。
怎么拼,要先知道这个人请求的是什么,是register还是login呢,怎么拿这个数据,data是接收到的数据,根据打印的结果,可知data是一堆字符串(如下),现在有一堆字符串,想要让你找到 login,整个先切行,然后再第0行,再用空格切,第1个就是login,然后先打印一下请求路径。
GET /login HTTP/1.1
Host: localhost:8090/login
connection
:keep-alive
Upgrade- Insecure- Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.
Accept: text/html, application/xhtml+xml, application/xm1;q=0.9, image/webp, image/apng, */*;q=0.8, application
Sec- Fetch-Site:none
Sec - Fetch-Mode: navigate
Sec - Fetch-User: ?1
Accept- Encoding: gzip, deflate, br
Accept-Language: zh-CN, zh;q=0.9,en;q=0.8
3.写上请求路径:
import socket
server_socket=socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
server_socket.bind((
‘0.0.0.0’,8090))
server_socket.listen(128)
while True
:
client_socket,client_addr=server_socket.accept()
data=client_socket.recv(1024).decode(‘utf8’ )
#浏览器发过来的数据有可能是空的
path=data.splitlines()[0].split(
‘ ’)[1]
print
(‘请求的路径是{}’.format(path
))
#响应头
response_ header = 'HTTP/1.1 200 OK\n' + ' content-type:text/html\n'
response_ header += '\n'
或者直接写成response_ header = 'HTTP/1.1 200 OK\n' + ' content-type:text/html\n\n'
#响应体
response_body=’hello world’
#拼成响应
response=response_header+response_body
#发送给客户端
client_ socket.send(response .encode('utf8'))
运行报错:
浏览器发过来的数据是空的
4.修改:
import socket
server_socket=socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
server_socket.bind((
‘0.0.0.0’,8090))
server_socket.listen(128)
while True
:
client_socket,client_addr=server_socket.accept()
data=client_socket.recv(1024).decode(
‘utf8’ )
#浏览器发过来的数据有可能是空的
print
(‘接收到{}的数据{}’.format(client_addr[0],data)
)
if data:
path=data.splitlines()[0].split(
‘ ’)[1]
print
(‘请求的路径是{}’.format(path
))
#响应头
response_ header = 'HTTP/1.1 200 OK\n' + ' content-type:text/html\n'
response_ header += '\n'
或者直接写成response_ header = 'HTTP/1.1 200 OK\n' + ' content-type:text/html\n\n'
#响应体
response_body=
’hello world’
#拼成响应
response=response_header+response_body
#发送给客户端
client_ socket.send(response .encode('utf8'))
运行结果,告诉我们请求的路径是/login
,接收到127.0.0.1的数据。
5.修改代码:
删掉“print
(‘接收到{}的数据{}’.format(client_addr[0],data
))”,只打印路径。
运行结果:
请求的路径是\login
请求的路径是\login
请求的路径是\favicon.ico
多一个,请求的路径是\favicon.ico
,这个不用管,这是浏览器书签里的图标
如果请求localhost:8090/register
,就会接收到 register。
6.最后写判断响应体返回不同的内容,默认path=’/’:
import socket
server_socket=socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
server_socket.bind((
‘0.0.0.0’,8090))
server_socket.listen(128)
while True
:
client_socket,client_addr=server_socket.accept()
data=client_socket.recv(1024).decode(‘utf8’ )
#浏览器发过来的数据有可能是空的
path=
’/’
if data:
path=data.splitlines()[0].split(
‘ ’)[1]
print
(‘请求的路径是{}’.format(path))
response_body=
’hello world’
if path ==
‘/login' :
response_ body
= '欢迎来到登录页面'
elif path == '/register':
response_ body
= '欢迎来到注册页面'
elif path == '/':
response_ body
= '欢迎来到首页'
#响应头
response_ header = 'HTTP/1.1 200 OK\n' + '
content-type:text/html\n'
response_ header += '\n'
或者直接写成response_ header = 'HTTP/1.1 200 OK\n' + '
content-type:text/html\n\n'
#响应体
response_body=’hello world’
#拼成响应
response=response_header+response_body
#发送给客户端
client_ socket.send(response .encode('utf8'))
运行结果:
登录可以显示内容但是乱码了,原因是读的和写的方式不一样,编码方式写的时候是用utf8写的,但是浏览器是用gbk读的。Chrome 浏览器看不到编码方式,用IE浏览器可以快速查看编码方式访问192.178.31.199:8090,但是就是太慢了打不开。
可以用gbk写,把client_ socket.send(response .encode('utf8')
)写成client_ socket.send(response .encode('gbk')
),也可以告诉它打开方式用utf8打开。
7.怎么告诉它用utf8打开,响应头写成:
response_ header = 'HTTP/1.1 200 OK\n' + '
content-type:text/html ;
’charset=utf8\n’
运行结果就是正确的。
把path=’/’
改成path=’ ’,访问localhost:8090,运行显示“欢迎来到首页”。
如果访问localhost:8090/test,显示“hello world”,因为没有处理test,不能判断,就会显示默认值“hello world”,但是显示默认值会有一点问题。输入的如果没法匹配应该显示页面未找到。
代码:
import socket
server_socket=socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
server_socket.bind((
‘0.0.0.0’,8090))
server_socket.listen(128)
while True
:
client_socket,client_addr=server_socket.accept()
data=client_socket.recv(1024).decode(
‘utf8’ )
#浏览器发过来的数据有可能是空的
path=
’/’
if data:
path=data.splitlines()[0].split(
‘ ’)[1]
print
(‘请求的路径是{}’.format(path))
response_body=
’hello world’
#响应头
response_ header = 'HTTP/1.1 200 OK\n' #200 OK
成功了
if path ==
‘/login' :
response_ body
= '欢迎来到登录页面'
elif path == '/register':
response_ body
= '欢迎来到注册页面'
elif path == '/':
response_ body
= '欢迎来到首页'
else:
#页面未找到 404 Page Not Found 状态码
response_ header = 'HTTP/1.1 404 Page Not Found'
response_ header += 'content-type:text/html ;
’charset=utf8\n’
response_ header +=
’\n’
#响应
response=response_header+response_body
#发送给客户端
client_ socket.send(response .encode('utf8'))
访问 localhost:8090/register,状态码200 OK
访问 localhost:8090/test,出现404
8.完善代码:
import socket
server_socket=socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
server_socket.bind((
‘0.0.0.0’,8090))
server_socket.listen(128)
while True
:
client_socket,client_addr=server_socket.accept()
data=client_socket.recv(1024).decode(
‘utf8’ )
#浏览器发过来的数据有可能是空的
path=
’ ’
if data:
path=data.splitlines()[0].split(
‘ ’)[1]
print
(‘请求的路径是{}’.format(path
))
response_body=’hello world’
#响应头
response_ header = 'HTTP/1.1 200 OK\n'
#200 OK 成功了
if path
==
‘/login'
:
response_ body
= '欢迎来到登录页面'
elif path == '/register':
response_ body
= '欢迎来到注册页面'
elif path == '/':
response_ body
= '欢迎来到首页'
else:
#页面未找到 404 Page Not Found 状态码
response_ header = 'HTTP/1.1 404 Page Not Found\n'
#响应头写完要换行,注意“\n”
response_ body
= '对不起,您要查看的页面不存在!!!'
response_ header += 'content-type:text/html ;
’charset=utf8\n’
response_ header +=
’\n’
#响应
response=response_header+response_body
#发送给客户端
client_ socket.send(response .encode('utf8'))