根据不同的请求返回不同的内容| 学习笔记

简介: 快速学习根据不同的请求返回不同的内容

开发者学堂课程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=colorred>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

connectionkeep-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'))

运行报错:

image.png

浏览器发过来的数据是空的

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

image.png

访问 localhost:8090/test,出现404

image.png

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'))

相关文章
|
7月前
接口请求内容改变的问题.
接口请求内容改变的问题.
27 0
|
存储 Java
【方法返回地址】
【方法返回地址】
|
3月前
|
开发者
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
42 1
|
5月前
|
前端开发 Java Spring
设置响应内容类型的几种方法比较
设置响应内容类型的几种方法比较
|
移动开发 应用服务中间件 Android开发
踩坑记录:请求接口status返回0
踩坑记录:请求接口status返回0
踩坑记录:请求接口status返回0
全局响应返回处理
全局响应返回处理
48 0
|
搜索推荐 UED
每日一道面试题之http 响应码 301 和 302 代表的是什么?它们有什么区别?
每日一道面试题之http 响应码 301 和 302 代表的是什么?它们有什么区别?
132 0
|
XML 数据格式
为什么访问同一个网址却返回不同的内容
为什么访问同一个网址却返回不同的内容
怎么修改请求的参数和响应
怎么修改请求的参数和响应
106 0
|
JSON 缓存 前端开发
【Ajax入门技术】如何设置请求头 体 ,利用ajax进行取消请求数据操作,解决重复请求问题,请求超时网络异常以及获取json数据
【Ajax入门技术】如何设置请求头 体 ,利用ajax进行取消请求数据操作,解决重复请求问题,请求超时网络异常以及获取json数据
294 0
【Ajax入门技术】如何设置请求头 体 ,利用ajax进行取消请求数据操作,解决重复请求问题,请求超时网络异常以及获取json数据

热门文章

最新文章