我正在尝试使用对Python服务器(Flask)的调用来验证Web应用程序中的用户,然后调用主服务器。我能够将凭据传递给Flask服务器并进行身份验证。但是身份验证,它应该将成功消息传递给客户端,以便我可以相应地重定向/显示网页上的消息。但是,它没有回馈消息。相反,它给出了一个损坏的管道错误,在authentication.I编写了以下代码 客户代码:
1)的Javascript:
function login()
{
var user=document.getElementById("username").value;
var pass=document.getElementById("password").value;
//alert(JSON.stringify({username:user,password:pass}));
//var contentType = "application/x-www-form-urlencoded";
var ajax=$.ajax({
type: "POST",
//crossDomain: true,
data: JSON.stringify({username:user,password:pass}),
contentType:"application/x-www-form-urlencoded",
dataType: "json",
url: "http://0.0.0.0:8081"
//async:true
}).done(function(data){
// alert(data);
});
ajax.fail(function(data){
//alert(data);
});
}
2)HTML:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<!--link rel="stylesheet" type="text/css" href="login.css"-->
<script type="text/javascript" src="login_auth.js" ></script>
</head>
<body>
<!-- Begin Page Content -->
<div id="container">
<form>
<input type="text" id="username" name="username" value="sayan" >
<input type="password" id="password" name="password" value="3BxTPu+y4YA">
<div id="lower">
<input type="checkbox" id="checkbox" name="checkbox"><label class="check" for="checkbox">Keep me logged
in</label>
<input type="submit" value="Login" onclick="login()">
</div>
<!--/ lower-->
</form>
</div><!--/ container-->
<!-- End Page Content -->
</body>
</html>
3)Flask服务器代码:
app = Flask(__name__)
@app.route('/', methods=['POST','GET','OPTIONS'])
@crossdomain(origin='*')
def login():
data= request.get_json(force=True);
br=mechanize.Browser()
br.open('https://weaveprod.ucdp.utah.edu/geoserver/web/?wicket:bookmarkablePage=:org.geoserver.web.GeoServerLoginPage')
br.select_form(nr=0)
username=data['username'];
password=data['password'];
br['username']= username
br['password']= password
response= br.submit()
mainpage=response.read()
val=mainpage.find('Invalid username/password combination')
if val==-1:
success = True
else:
success=False
print success
return jsonify(text=success);
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8081, debug=True,threaded=True)
的问题:
1)如果我通过Mozilla浏览器而不是Chrome发出请求,我会收到GET请求而不是POST,并且不会进行身份验证。
2)虽然我发出了POST请求,但我在地址栏的url中看到了用户名和密码。
请帮助我......我现在辛苦了2天。
谢谢, 萨扬
答案 0 :(得分:2)
javascript代码应该包含在最后(或延迟执行$(document).ready
)。在呈现表单字段之前,代码试图使用document.getElementById("username").value
获取元素。除此之外,在单击提交按钮时,表单通常会提交刷新页面并呈现以前无用的ajax调用。此外,页面刷新可以中断先前进行的ajax调用,导致您在日志中看到的管道错误。
这是一个稍微好一点的方法。让我们直接绑定到表单提交事件。在此之前将id="loginForm"
添加到表单中,以便我们可以使用jQuery直接获取它,并从提交按钮中删除onclick
属性。
现在是javascript部分。
$(document).ready(function() {
// bind the form submit event to our function
$("#loginForm").bind('submit', function(e) {
// prevent page refresh
e.preventDefault();
// post the data
var ajax=$.ajax({
type: "POST",
data: $("#loginForm").serialize(),
url: "http://localhost:8081/"
}).done(function(data){
console.log('done!')
});
ajax.fail(function(data){
console.log('error!');
});
});
});
在服务器端,获取表单字段数据,如request.form.get('username')
和request.form.get('password')
。