【问题标题】:The method is not allowed for the requested URL. flask请求的 URL 不允许该方法。烧瓶
【发布时间】:2023-03-09 18:48:01
【问题描述】:

我尝试创建一个用户登录的网络服务。我希望网页是动态的,所以我使用 javascript jquery html 和问题,如果我在正确的值中填写用户名和密码然后传递给另一个

127.0.0.1 - - [12/Apr/2015 08:54:42] "GET /login HTTP/1.1" 200 -

127.0.0.1 - - [12/Apr/2015 08:54:51] "POST /login HTTP/1.1" 405 -

这个/登录用户

@APP.route('/loginuser', methods=['POST'])
def login():

    error = None
    con = mdb.connect('localhost','testuser', 'test623', 'test') 
    cur = con.cursor()
    cur.execute("SELECT * FROM ADMIN")
    rows = cur.fetchall()
    login=False
    for row in rows:
             if request.form['username'] == row[0] and  request.form['password'] == row[1]:
                login=True
                print request.form['username']
                print request.form['password']
           
    
    if login ==False:
             error = 'Invalid Credentials. Please try again.'
             response.result == error
    else:
             
             response.result == "success"
    con.close

还有这个 /login

@APP.route('/login')
def login1():

      return render_template('login1.html')

script.js

function loginAndRedirect (){
	var user = $('#txtUsername').val();
	var pass = $('#txtPassword').val();
	$.ajax({
		url: '/loginuser',
		data: $('form').serialize(),
		type: 'POST',
		dataType: 'json',
		success: function(response){

			if (response.result == "success") {
				alert("You have been logged in!");
				window.location.href="hello.html";
			} else {
				alert(result.details);          
			}
		},
		error: function(error){
			console.log(error);
		}
	});	
}

并登录:

<!DOCTYPE html>
<!--[if (gte IE 9)|!(IE)]><!--> <html lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>MONOTORING_LAN</title>
<link href="static/css/style.css" rel="stylesheet">
<script src="static/js/jquery-1.9.0.js"></script>
<script src="static/js/script.js"></script>
 
</head>
<body>
<div class="container">
	<section id="content">
		<form method="POST" class="form-signin" role="form">
			<h1>Login Form</h1>
			<div> 
                             
				<input type="text" id="txtUsername" placeholder="Username" name="username"  required autofocus>
                                <input type="password" id="txtPassword" placeholder="Password" name="password" required autofocus>
                               <input class="btn btn-default" id = "submitButton" type="submit" value="Login">
  
                      </div>
		</form><!-- form -->
		{% if error %}
                    <p class="error"><strong>Error:</strong> {{ error }}
                {% endif %}
	</section><!-- content -->

</div><!-- container -->
</body>
 <script src="static/js/script.js>
      $(".form-signin").on("submit", function(e) {
       e.preventDefault();
        loginAndRedirect();});
 </script>
</html>
   

【问题讨论】:

  • 您能否展示/loginuser/login 处理程序以及您是如何调用它们导致异常的?

标签: javascript jquery html python-2.7 flask


【解决方案1】:

问题是您实际上从未将脚本与formsubmit 事件挂钩,因此表单是由浏览器提交的。但是,由于您没有指定 action 属性,因此表单会将自身提交到它当前所在的 URL (/login),从而导致您现在看到的 405。将您的 loginAndRedirect 连接到表单的 submit 事件,您将不再 POST 到 /login 端点:

<script>
$(".form-signin").on("submit", function(e) {
  e.preventDefault();
  loginAndRedirect();
});
</script>

一些提示:

  • 添加一个指向 /loginAndRedirect 端点的 action,这样即使您的 JavaScript 失败,用户仍然可以登录(除非您计划构建单页应用程序)
  • 与其在应用程序中查找所有用户并遍历他们,不如在 SQL 查找中添加WHERE 子句,并通过usernamepassword 查找用户。不要将用户提供的值与您的 SQL 连接,而是使用参数化查询。
  • 您需要返回响应,而不是分配给 response 对象(Flask 没有提供响应,因此它是您项目本地的东西)。

【讨论】:

  • 谢谢先生,给您带来的不便,我深表歉意,我是jquery的初学者,您能否再解释一下脚本,或者我必须放入html页面对吗?对于你让我说的要点,尤其是我不太理解的最后一项@Sean Vieira
  • 是的,将脚本放在&lt;/body&gt; 标签之前,它会起作用。至于/loginAndRedirect 的Flask 方法中是否需要return - 如果您不向客户端return some_response,Flask 会抛出错误。
【解决方案2】:

我在你的login() 函数中发现了几个问题:

  1. 你没有返回 response 对象,你是从哪里得到它的?
  2. con.close 应该是con.close(),但我想你也应该关闭光标:

    cur.close()
    con.close()
    

【讨论】:

  • 作为响应,我将在 script.js 中使用返回页面 hello.htm if (response.result == "success") { alert("You have been logged in!"); window.location.href="hello.html"; } 其他 { 警报(结果。详细信息); }
  • 我像你说的那样改变,但结果相同:( 请求的 URL 不允许该方法。
猜你喜欢
  • 2020-07-30
  • 2021-10-16
  • 2016-01-22
  • 2016-12-12
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
相关资源
最近更新 更多