我试图通过连接到Flask内置的RESTful API来使用JavaScript进行授权.但是,当我发出请求时,我收到以下错误:
XMLHttpRequest无法加载http:// myApiUrl/login.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许原点'null'访问.
我知道API或远程资源必须设置标题,但为什么在我通过Chrome扩展程序Postman发出请求时它可以正常工作?
这是请求代码:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
Run Code Online (Sandbox Code Playgroud) 我在从jquery ajax发布数据时遇到问题.
$('#clickme').click( function() {
var data = save_input(); // data
data['_sid'] = $survey_id; // survey_id injected from flask
data['_uip'] = $user_ip; // user_ip injected from flask, request.remote_addr
$.ajax({
type : "POST",
url : "{{ url_for('mod.load_ajax') }}",
data: JSON.stringify(data),
contentType: 'application/json;charset=UTF-8',
success: function(result) {
console.log(result);
}
});
console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
从代码中,data是一个像javascript的对象
{
'foo' : 'foo',
'bar' : 'bar',
'fo_' : 42,
}
Run Code Online (Sandbox Code Playgroud)
我想在烧瓶中做的是:
@mod.route('/load_ajax', methods=["GET", "POST"])
def load_ajax():
if request.method == "POST":
# load _sid and _uip from posted …Run Code Online (Sandbox Code Playgroud) 我需要通过XavascriptHttpRequest从javascript向python服务器发送数据.因为我使用的是localhost,所以我需要使用CORS.我正在使用Flask框架及其模块flask_cors.作为javascript我有这个:
var xmlhttp;
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else {// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST", "http://localhost:5000/signin", true);
var params = "email=" + email + "&password=" + password;
xmlhttp.onreadystatechange = function() {//Call a function when the state changes.
if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
alert(xmlhttp.responseText);
}
}
xmlhttp.send(params);
Run Code Online (Sandbox Code Playgroud)
和python代码:
@app.route('/signin', methods=['POST'])
@cross_origin()
def sign_in():
email = cgi.escape(request.values["email"])
password = cgi.escape(request.values["password"])
Run Code Online (Sandbox Code Playgroud)
但当我执行它时,我收到此消息:
XMLHttpRequest无法加载localhost:5000/signin.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许原点'null'访问.
我该如何解决?我知道我需要使用一些"Access-Control-Allow-Origin"标头,但我不知道如何在此代码中实现它.顺便说一句,我需要使用纯JavaScript.
我正在尝试使用jquery创建一个交叉原始请求,但它一直被消息拒绝
XMLHttpRequest无法加载http:// ...请求的资源上不存在"Access-Control-Allow-Origin"标头.原因......因此不允许访问.
我正在使用flask,heroku和jquery
客户端代码如下所示:
$(document).ready(function() {
$('#submit_contact').click(function(e){
e.preventDefault();
$.ajax({
type: 'POST',
url: 'http://...',
// data: [
// { name: "name", value: $('name').val()},
// { name: "email", value: $('email').val() },
// { name: "phone", value: $('phone').val()},
// { name: "description", value: $('desc').val()}
//
// ],
data:"name=3&email=3&phone=3&description=3",
crossDomain:true,
success: function(msg) {
alert(msg);
}
});
});
});
Run Code Online (Sandbox Code Playgroud)
在heroku方面,我正在使用烧瓶,就像这样
from flask import Flask,request
from flask.ext.mandrill import Mandrill
try:
from flask.ext.cors import CORS # The typical way to import flask-cors
except ImportError:
# Path …Run Code Online (Sandbox Code Playgroud) 我正在尝试让Flask正确处理跨站点脚本.我从这里采取了跨域装饰器片段:http: //flask.pocoo.org/snippets/56/
在下面的代码中,我将装饰器片段和基本的烧瓶服务器放在一起.
我正在使用headers ='Content-Type'调用装饰器, 因为否则我得到"请求标头字段Access-Control-Allow-Headers不允许Content-Type".在浏览器中.
所以这是我的问题:按原样,下面的代码有效.但是,当我想限制只有这样的特定服务器时:
@crossdomain(origin='myserver.com', headers='Content-Type')
Run Code Online (Sandbox Code Playgroud)
我收到浏览器错误
" Access-Control-Allow-Origin不允许使用来源http://myserver.com."
除了origin ='*'之外,我无法使其工作.
有人有什么想法吗?
这是完整的代码:
from datetime import timedelta
from flask import make_response, request, current_app, Flask, jsonify
from functools import update_wrapper
def crossdomain(origin=None, methods=None, headers=None,
max_age=21600, attach_to_all=True,
automatic_options=True):
if methods is not None:
methods = ', '.join(sorted(x.upper() for x in methods))
if headers is not None and not isinstance(headers, basestring):
headers = ', '.join(x.upper() for x in headers)
if not isinstance(origin, basestring):
origin …Run Code Online (Sandbox Code Playgroud) 我对反应很陌生,我正在尝试掌握如何正确使用 fetch。我有这个 python 烧瓶路线,我试图从后端点击它,它看起来像这样:
@app.route('/api/v1', methods=['POST'])
def postTest():
if not request.json:
return "not a json post"
return "json post succeeded"
Run Code Online (Sandbox Code Playgroud)
现在,当我与邮递员达成这一点时,我实际上能够获得成功的信息。
这是我的 reactjs fetch 的样子:
@app.route('/api/v1', methods=['POST'])
def postTest():
if not request.json:
return "not a json post"
return "json post succeeded"
Run Code Online (Sandbox Code Playgroud)
每当我运行我的应用程序并尝试将这个函数读到控制台时,我得到的结果是这样的:
有人可以向我解释我做错了什么以及我能做些什么来解决这个问题。我将不胜感激。
我正在尝试使用Flask构建一个api站点,我正在使用它Flask-jwt来提供令牌授权.
如果我在Apache中执行CORS(使用mod_headers添加Allow-Access头,就像这样),authorizaiton工作正常
Header set Access-Control-Allow-Origin "*"
但是,我希望有更详细的访问控制,而不是只使用通配符.我看着flask-cors,这是一个很好的包装,检查原点并发送标题.现在我的路由看起来像这样(并且在apache设置中没有标头操作)
@app.route('/protected/place')
@cross_origin(headers=['Content-Type']) # Send Access-Control-Allow-Headers
@jwt_required()
def my_view_func():
do something
Run Code Online (Sandbox Code Playgroud)
但是现在如果我从javascript发出http请求,我将无法从服务器获得Access-Control标头响应.(但是,如果我手动发布,比如做curl,我仍然可以看到交叉源插件工作和Access控件头)
当我删除@jwt_required包装器时,cross_origin包装器运行正常,它会给我响应.当应用jwt_required包装器时,无法从服务器看到响应.
我正在使用chrome调试我的客户端页面.BTW
我试图改变包装器的顺序,但它没有帮助.
是否可能,如果身份验证失败,cross_origin包装器将不会发送访问控制标头?
两个包装的源代码:
烧瓶-JWT:
https://github.com/mattupstate/flask-jwt/blob/master/flask_jwt/ 初始化的.py
烧瓶-CORS:
https://github.com/wcdolphin/flask -cors /斑点/主/ flask_cors.py
flask ×5
python ×5
cors ×3
javascript ×3
jquery ×3
ajax ×2
cross-domain ×1
cross-site ×1
heroku ×1
reactjs ×1