我正在开发一个短信营销服务。为了订阅我的服务,用户必须输入关键字memphis
。我已经编写了将用户号码添加到我的订阅者列表中的代码,但是如果某人的号码已经在列表中,我如何才能包括一个过程来检查已经存在的列表并回复一条消息,通知用户他们已经订阅了?
我已经尝试使用for循环来迭代csv文件中的每个数字:
def sms_subscription():
contact_num = request.values.get('From')
response = request.values.get('Body')
resp = MessagingResponse()
#NEW SUBSCRIBERS
if response.lower() == 'memphis':
with open('Subscriber_List.csv', 'r+') as subscriber_list:
subscriber_list_writer = csv.writer(subscriber_list)
for contact in subscriber_list:
if contact == contact_num:
resp.message("Your already subscribed")
return str(resp)
else:
subscriber_list_writer.writerow([contact_num])
resp.message("Thanks for subscribing to our local coupon book. As we get new deals, we'll notify via SMS. To opt-out reply 'STOP'")
return str(resp)
else:
resp.message("Be sure to check spelling and for spaces and try again.")
return str(resp
我已经用我的个人手机测试过了。我没有回复我我的号码已经订阅了,而是继续收到“谢谢您订阅了我们当地的优惠券图书”。
当我们获得新的交易时,我们会通过短信通知用户。要选择退出,用户应回复'STOP‘。
发布于 2019-06-03 04:50:33
我想我看到了问题所在。
你的代码:
def sms_subscription():
contact_num = request.values.get('From')
response = request.values.get('Body')
resp = MessagingResponse()
#NEW SUBSCRIBERS
if response.lower() == 'memphis':
with open('Subscriber_List.csv', 'r+') as subscriber_list:
subscriber_list_writer = csv.writer(subscriber_list)
for contact in subscriber_list:
if contact == contact_num:
resp.message("Your already subscribed")
return str(resp)
else:
subscriber_list_writer.writerow([contact_num])
resp.message("Thanks for subscribing to our local coupon book. As we get new deals, we'll notify via SMS. To opt-out reply 'STOP'")
return str(resp)
else:
resp.message("Be sure to check spelling and for spaces and try again.")
return str(resp
首先,您应该将subscriber_list
更改为subscriber_list.readlines()
,以获得其中每一行都是一个元素的列表。
在for循环中,您可以检查contact
是否等于contact_num
,但是contact
包含换行符(\n
) (在我测试它的时候,它可能包含空格或其他字符),因此不等于contact_num
。要解决这个问题,您可以在if contact == contact_num
上添加这些行(有几行代码可以做到这一点,例如使用正则表达式,但我使用这个示例是为了提高可读性和简单性)
contact = contact.replace('\n','')
contact = contact.replace(' ','')
它们所做的就是将换行符和空格替换为空,实质上就是删除它们。
此外,在for循环中,您将检查contact_num
是否在文件中,但如果它不是第一个元素,则它将运行以下内容:
else:
subscriber_list_writer.writerow([contact_num])
resp.message("Thanks for subscribing to our local coupon book. As we get new deals, we'll notify via SMS. To opt-out reply 'STOP'")
return str(resp)
您需要做的是检查文件中的所有元素,然后,如果没有找到该编号,则将其写入文件。当您返回一个值时,它将退出函数,因此如果文件中的第一个元素不是所需的电话号码,那么它将在else
下运行您的代码并退出函数。
要解决这个问题,只需移动
else:
subscriber_list_writer.writerow([contact_num])
resp.message("Thanks for subscribing to our local coupon book. As we get new deals, we'll notify via SMS. To opt-out reply 'STOP'")
return str(resp)
在for循环之外,删除else
--这是不需要的。循环现在将检查contact_num
是否在文件中,如果在,它将返回
"You're already subscribed"
,
如果不是,它会将num添加到文件中并返回
"Thanks for subscribing to our local coupon book. As we get new deals, we'll notify via SMS. To opt-out reply 'STOP'"
我假设MessagingResponse()
是一个类,如下所示:
class MessagingResponse:
def __init__(self,message):
self.message = message
如果是这样,resp.message("Your already subscribed")
将抛出一个错误;正确的语法是resp.message = "Your already subscribed"
。
最终代码(稍作修改):
编辑:
正如@jpmc26所说,使用csv读取器/写入器是更好的选择。在前面的代码中也有一些bug。编辑代码:
def sms_subscription():
contact_num = request.values.get('From')
response = request.values.get('Body')
resp = MessagingResponse("") #you might want to remove the quotes if this throws an error
#NEW SUBSCRIBERS
if response.lower() == 'memphis':
with open('Subscriber_List.csv', 'r+') as subscriber_list:
for contact in csv.reader(subscriber_list):
if contact_num in contact:
resp.message = "You're already subscribed"
return resp
csv.writer(subscriber_list).writerow([contact_num])
resp.message = ("Thanks for subscribing to our local coupon book. As we get new deals, we'll notify via SMS. To opt-out reply 'STOP'")
return resp
else:
resp.message = "Be sure to check spelling and for spaces and try again."
return resp
https://stackoverflow.com/questions/56418430
复制相似问题