Flask-让JavaScript和Python进行通信
我正在使用Flask Python框架构建一个相当简单的CRM。我有一个数据库的公司,我们有兴趣联系。用户首先输入希望联系的公司数量。然后将用户重定向到此页面: 基本上,对于此页面上的每一行/公司,用户将单击“联系人”或“不联系”单选按钮 我正在努力实现的目标 一旦用户单击底部的“让魔法发生”按钮,JavaScript就会在每一行中运行,并查看单击了哪个按钮。然后将数据库唯一ID附加到两个数组“contact”和“remove”中的一个。然后,这些信息通过getJSON传递给python,python使用request.args.get捕获json数据 最后,Python做两件事之一:Flask-让JavaScript和Python进行通信,javascript,python,json,flask,Javascript,Python,Json,Flask,我正在使用Flask Python框架构建一个相当简单的CRM。我有一个数据库的公司,我们有兴趣联系。用户首先输入希望联系的公司数量。然后将用户重定向到此页面: 基本上,对于此页面上的每一行/公司,用户将单击“联系人”或“不联系”单选按钮 我正在努力实现的目标 一旦用户单击底部的“让魔法发生”按钮,JavaScript就会在每一行中运行,并查看单击了哪个按钮。然后将数据库唯一ID附加到两个数组“contact”和“remove”中的一个。然后,这些信息通过getJSON传递给python,py
- 对于remove数组中的公司,它会更改相应数据库实例中的bool值
- 对于联系人阵列中的公司,它运行一个单独的功能,使用SMTP向该公司发送电子邮件
@app.route('/send_emails')
def send_emails():
contact = request.args.get('contact')
remove = request.args.get('remove')
print contact
print remove
return ('', 204) #No need to return anything
email.js
$('#批处理页面.魔术按钮')。单击(函数(){
//迭代每个公司行
$(“#批页表tr.company-row”)。每个(功能(i,公司){
公司=$(公司);
company_id=company.attr('class').split('')[1];
//分配用于发送电子邮件和删除通讯的阵列
var触点=[];
var-remove=[];
//检查是否选中了“联系人”或“不联系”复选框
if(company.children('td.contact company')).children('input')。是(':checked')){
联系人推送(公司id);
}else if(company.children('td.remove company')。children('input')。为(':checked')){
移除、推送(公司标识);
}
//将数据传递给Python
$.getJSON(“/send_email”{
联系人:联系人,
移除:移除
});
});
$('div#batch page').html('p>耐心等待,联系公司!');
});
batch.html
{%为公司中的公司%}
{{company.company_name}
{{company.email_address}
更改公司信息
公司名称
公司网站
公司电子邮件
刮取日期:{{company.scraped_on}
{%endfor%}
更新#1
尝试使用json模块中的loads方法加载请求时,我收到以下错误消息:
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Library/Python/2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/Library/Python/2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/Library/Python/2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/wyssuser/Desktop/dscraper/app.py", line 82, in send_emails
content = json.loads(request.json)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
您需要从请求中获取json
content = request.json
然后使用您最喜欢的json解析器将json解析为一个对象
obj = json.loads(content)
为了回答您的问题,“让javascript将每一行单独或一次全部发送到一个数组中的python,在性能方面会更有效吗?”,一次发送所有数据并返回一个返回将更有效。首先,使用您作为查询参数传递的JSON对象发出GET请求
这里的问题是jQuery.getJSON()
以非传统方式序列化列表。因此,如果您查看浏览器接收到的请求,它将类似于:
http://example.com/?contact[]=me&contact[]=others&contact[]=hr&remove[]=you&remove[]=doug
现在,Flask将把这个查询字符串解析成一个args dict,其中包含键contact[]
和remove[]
,但是由于您执行的是'request.args.get('contact'),所以什么也得不到
解决方案是在像这样传递到jQuery.getJSON()
之前自己创建查询参数。这可以通过以下方式实现:
注意传递给jQuery.param()
的true
以传统格式返回querystring,如下所示:
contact=me&contact=others&contact=hr&remove=you&remove=doug
现在,您可以使用
contacts = request.args.getList('contact')
print(contacts) # ['me', 'others', 'hr']
输入错误:
contacts=request.args.getList('contact')
。我想您应该已经编写了contacts=request.args.getlist('contact')
我尝试了这个方法,但我收到一条错误消息,基本上是说当您从javascript访问webapi时,json不是“字符串或缓冲区”,您需要确保您正在设置头。您需要Content Type=“application/json”,否则将不会设置请求的json部分。您还应该为您的返回类型添加Accepts:“application/json”。$.getJSON发出一个GET
请求,并将数据作为查询字符串传递给它,因此request中不会有任何内容。json
可能是重复的,我不认为它是重复的。这是使用GET not POST,尽管使用POST可能更好。我需要加密JSON吗?或者SSL证书会像烧瓶中的其他东西一样处理JSON吗?只要您使用https(SSL或TLS),加密会在连接层自动进行,因此无需加密任何内容。
contacts = request.args.getList('contact')
print(contacts) # ['me', 'others', 'hr']