Flask-让JavaScript和Python进行通信

Flask-让JavaScript和Python进行通信,javascript,python,json,flask,Javascript,Python,Json,Flask,我正在使用Flask Python框架构建一个相当简单的CRM。我有一个数据库的公司,我们有兴趣联系。用户首先输入希望联系的公司数量。然后将用户重定向到此页面: 基本上,对于此页面上的每一行/公司,用户将单击“联系人”或“不联系”单选按钮 我正在努力实现的目标 一旦用户单击底部的“让魔法发生”按钮,JavaScript就会在每一行中运行,并查看单击了哪个按钮。然后将数据库唯一ID附加到两个数组“contact”和“remove”中的一个。然后,这些信息通过getJSON传递给python,py

我正在使用Flask Python框架构建一个相当简单的CRM。我有一个数据库的公司,我们有兴趣联系。用户首先输入希望联系的公司数量。然后将用户重定向到此页面:

基本上,对于此页面上的每一行/公司,用户将单击“联系人”或“不联系”单选按钮

我正在努力实现的目标

一旦用户单击底部的“让魔法发生”按钮,JavaScript就会在每一行中运行,并查看单击了哪个按钮。然后将数据库唯一ID附加到两个数组“contact”和“remove”中的一个。然后,这些信息通过getJSON传递给python,python使用request.args.get捕获json数据

最后,Python做两件事之一:

  • 对于remove数组中的公司,它会更改相应数据库实例中的bool值
  • 对于联系人阵列中的公司,它运行一个单独的功能,使用SMTP向该公司发送电子邮件
我挂断电话的地方

我似乎无法在Python中检索json数据,我现在只想做一个简单的print语句来显示我可以提取数据

另外,让javascript将每一行单独或一次全部发送到一个数组中的python,在性能方面会更有效吗

脚本

app.py

@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']