作者:骑着母猪去相亲 | 来源:互联网 | 2023-09-01 06:09
采用form表格的post请求向后端传递数据本系列即尽量采用原生代码方式实现浏览器与web服务器之间进行交互;帮助小白们理解web服务器的工作原理。采用form表格从前端浏览器向后
采用form表格的post请求向后端传递数据
本系列即尽量采用原生代码方式实现浏览器与web服务器之间进行交互;帮助小白们理解web服务器的工作原理。
采用form表格从前端浏览器向后端提交数据是一种最原始的前端传递数据的方式,虽然代码执行较为麻烦,但是却有助于深刻理解前后端的交互原理。
以下面html代码为例:
<form action="login" method="post">
<p>
<span class="spanText">用户名</span>
<input type="text" name="username" class="uText">
</p>
<p>
<span class="spanText">密 码</span>
<input type="password" name="passwd" class="uText" placeholder="请输入6-20位号码字符">
</p>
<span class="spanText"></span>
<p>
<span class="isSaved"><input type="checkbox" name="isSaved" checked>记住密码</span>
<span class="forget"><a href="#">忘记密码?</a>
<a href="#">快捷登录</a></span>
</p>
<p>
<span class="spanText"></span>
<input type="submit" name="login" class="login" value="登录">
<a href="./register.html"><input type="button" name="regist" class="regist" value="注册页面"></a>
</p>
</form>
点击‘登录’按钮,表格中的用户名和密码信息通过表格以POST方式提交到后台。
在不使用框架中的request方法的前提下,可以直接从请求信息的请求体部分获取数据。
(提交的信息都保存在了请求体中,可以采用以下代码获取。)
获取信息执行代码(web服务器执行代码,部分代码截取)
def handle_client(self, conn):
# 接受浏览器请求
request_data = conn.recv(2048).decode('utf-8')
request_lines = request_data.splitlines()
print(request_lines)
# 获取请求行信息(判断请求方式 get还是post )
request_line = request_lines[0]
# 获取请求体信息(post请求信息在请求体中,如果为get请求,获取内容为空)
request_msges = request_lines[-1]
举例(用户名为:闪电侠,密码为123456)
后台获取的有效请求体信息为:
'username=%E9%97%AA%E7%94%B5%E4%BE%A0&passwd=123456&isSaved=on&login=%E7%99%BB%E5%BD%95'
后端字符串解析代码
执行代码如下(代码辅助理解,不能直接执行):
import os
from urllib.parse import unquote
from collections import defaultdict
#定义函数将请求体字符串转化为字典格式
def msg_to_dict(msg):
lst = msg.split('&')
del lst[-1]
mdt = defaultdict(list)
for i in lst:
j = i.split('=')
print(unquote(j[1])) #urllib.parse中的unquote方法将请求体信息中的中文加密信息(含有%)解码为中文字符。
mdt.setdefault('%s'%j[0], []).append(unquote(j[1]))
return mdt
#定义登录函数
def login(env,set_headers):
status = '200 OK'
headers = [('Content-Type', 'text/html;charset=utf-8')] #允许前端接收utf-8格式的中文响应字符
set_headers(status, headers)
msg = env.get('MSG') #获取前端提交的响应体内容(获取用户名和密码)
mdt = msg_to_dict(msg) #将请求体信息转化为字典格式
if mdt['username'][0] == '' or mdt['passwd'][0] == '':
return '用户名或密码有误,请重新输入!!'
else:
res = do_login(mdt) #进一步执行登录指令(函数略)
if res:
filename = os.path.join(BASE_DIR, 'static/hero.html')
print(filename)
with open(filename,'r') as fd:
data = fd.read()
return data
else:
return 'Username or password is wrong!'
按照上述思路代码执行后,案例的代码执行结果如下
前端数据提交后,后端将请求体信息转化为字典的执行结果:
mdt = {'isSaved': ['on'], 'username': ['闪电侠'], 'passwd': ['123456']})
后端根据解析出的数据信息进一步执行登录函数。
在不采用request方法的前提下,客户端的注册,登录,以及发起数据库的增删改查请求,都可以采用这种思路来完成。