热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python原生代码(无框架,无AJAX技术)前后端数据交互

采用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">&nbsp;&nbsp;</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>

python原生代码(无框架,无AJAX技术)前后端数据交互
点击‘登录’按钮,表格中的用户名和密码信息通过表格以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方法的前提下,客户端的注册,登录,以及发起数据库的增删改查请求,都可以采用这种思路来完成。

推荐阅读
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 前端库Bootstrap框架:「11]使用 span 创建行内元素
    前端库Bootstrap框架:「11]使用 span 创建行内元素 ... [详细]
  • 本篇文章为大家展示了input语句的作用有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。HTML标签 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 第二次网页前端培训笔记(表单,INPUT及常用字符)
    1.表单form2.INPUT编号: ... [详细]
  • 前端判断登陆页面输入是否符合要求 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
author-avatar
骑着母猪去相亲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有