Skip to content

Commit 283081b

Browse files
authored
Merge pull request #71 from seratch/issue-66
Fix #66 by supporting current_app (LocalProxy)
2 parents 5952e0f + 7ddd051 commit 283081b

File tree

5 files changed

+74
-6
lines changed

5 files changed

+74
-6
lines changed

example/current_app/main.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# ------------------
2+
# Only for running this script here
3+
import sys
4+
from os.path import dirname
5+
sys.path.insert(1, f"{dirname(__file__)}/../..")
6+
# ------------------
7+
8+
import os
9+
from slack import WebClient
10+
import logging
11+
logging.basicConfig(level=logging.DEBUG)
12+
13+
from flask import Flask
14+
15+
app = Flask(__name__)
16+
17+
with app.app_context():
18+
from test_module.slack_app import slack_events_adapter
19+
20+
slack_bot_token = os.environ["SLACK_BOT_TOKEN"]
21+
slack_client = WebClient(slack_bot_token)
22+
23+
24+
@slack_events_adapter.on("message")
25+
def handle_message(event_data):
26+
message = event_data["event"]
27+
if message.get("subtype") is None and "hi" in message.get('text'):
28+
channel = message["channel"]
29+
message = "Hi <@%s>! :tada:" % message["user"]
30+
slack_client.chat_postMessage(channel=channel, text=message)
31+
32+
33+
@slack_events_adapter.on("error")
34+
def error_handler(err):
35+
print("ERROR: " + str(err))
36+
37+
# (Terminal A)
38+
# source env/bin/activate
39+
# (env) $ export SLACK_BOT_TOKEN=xoxb-***
40+
# (env) $ export SLACK_SIGNING_SECRET=**
41+
# (env) $ cd example/current_app
42+
# (env) $ FLASK_APP=main.py FLASK_ENV=development flask run --port 3000
43+
44+
# (Terminal B)
45+
# ngrok http 3000
46+
47+
# in Slack
48+
# /invite @{your app's bot user}
49+
# post a message "hi" in the channel

example/current_app/test_module/__init__.py

Whitespace-only changes.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# ------------------
2+
# Only for running this script here
3+
import logging
4+
import sys
5+
from os.path import dirname
6+
7+
sys.path.insert(1, f"{dirname(__file__)}/../../..")
8+
logging.basicConfig(level=logging.DEBUG)
9+
# ------------------
10+
11+
from flask import current_app as app
12+
from slackeventsapi import SlackEventAdapter
13+
import os
14+
15+
slack_signing_secret = os.environ["SLACK_SIGNING_SECRET"]
16+
slack_events_adapter = SlackEventAdapter(slack_signing_secret, "/slack/events", app)

slackeventsapi/server.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
from flask import Flask, request, make_response, Blueprint
1+
import hashlib
2+
import hmac
23
import json
34
import platform
45
import sys
5-
import hmac
6-
import hashlib
76
from time import time
7+
8+
from flask import Flask, request, make_response, Blueprint
9+
from werkzeug.local import LocalProxy
10+
811
from .version import __version__
912

1013

@@ -18,10 +21,10 @@ def __init__(self, signing_secret, endpoint, emitter, server):
1821
# If a server is passed in, bind the event handler routes to it,
1922
# otherwise create a new Flask instance.
2023
if server:
21-
if isinstance(server, Flask) or isinstance(server, Blueprint):
24+
if isinstance(server, (Flask, Blueprint, LocalProxy)):
2225
self.bind_route(server)
2326
else:
24-
raise TypeError("Server must be an instance of Flask or Blueprint")
27+
raise TypeError("Server must be an instance of Flask, Blueprint, or LocalProxy")
2528
else:
2629
Flask.__init__(self, __name__)
2730
self.bind_route(self)

tests/test_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def test_server_not_flask():
1818
with pytest.raises(TypeError) as e:
1919
invalid_flask = "I am not a Flask"
2020
SlackEventAdapter("SIGNING_SECRET", "/slack/events", invalid_flask)
21-
assert e.value.args[0] == 'Server must be an instance of Flask or Blueprint'
21+
assert e.value.args[0] == 'Server must be an instance of Flask, Blueprint, or LocalProxy'
2222

2323

2424
def test_blueprint_server():

0 commit comments

Comments
 (0)