I was following the following guide (https://abhaykashyap.com/blog/post/tutorial-how-build-facebook-messenger-bot-using-django-ngrok) on how to create a chatbot, until the part where I updated the views.py. There seems to be some issue with the method declaration and I don't know what is wrong. Other than that, the code is almost exactly the same as the guide (with some imports that the guide creator forgot to add). Here is the error I got when trying to run the server in my virtual environment:
(ivanteongbot) Ivans-MacBook-Pro:ivanteongbot ivanteong$ python manage.py runserver
Performing system checks...
Unhandled exception in thread started by <function wrapper at 0x1097a2050>
Traceback (most recent call last):
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 121, in inner_run
self.check(display_num_errors=True)
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/core/management/base.py", line 385, in check
include_deployment_checks=include_deployment_checks,
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/core/management/base.py", line 372, in _run_checks
return checks.run_checks(**kwargs)
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/core/checks/registry.py", line 81, in run_checks
new_errors = check(app_configs=app_configs)
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/core/checks/urls.py", line 14, in check_url_config
return check_resolver(resolver)
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/core/checks/urls.py", line 24, in check_resolver
for pattern in resolver.url_patterns:
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/urls/resolvers.py", line 310, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/urls/resolvers.py", line 303, in urlconf_module
return import_module(self.urlconf_name)
File "/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/Users/ivanteong/Desktop/comp9323/ivanteongbot/ivanteongbot/urls.py", line 24, in <module>
url(r'^fb_ivanteongbot/', include('fb_ivanteongbot.urls')),
File "/Users/ivanteong/Envs/ivanteongbot/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 50, in include
urlconf_module = import_module(urlconf_module)
File "/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/Users/ivanteong/Desktop/comp9323/ivanteongbot/fb_ivanteongbot/urls.py", line 3, in <module>
from .views import IvanTeongBotView
File "/Users/ivanteong/Desktop/comp9323/ivanteongbot/fb_ivanteongbot/views.py", line 8, in <module>
class IvanTeongBotView(generic.View):
File "/Users/ivanteong/Desktop/comp9323/ivanteongbot/fb_ivanteongbot/views.py", line 15, in IvanTeongBotView
@method_decorator(csrf_exempt)
NameError: name 'method_decorator' is not defined
The following code is what I have in views.py for my app directory:
from django.shortcuts import render
# ivanteongbot/fb_ivanteongbot/views.py
from django.views import generic
from django.http.response import HttpResponse
from django.views.decorators.csrf import csrf_exempt # add this
# Create your views here.
class IvanTeongBotView(generic.View):
def get(self, request, *args, **kwargs):
if self.request.GET['hub.verify_token'] == '2318934571':
return HttpResponse(self.request.GET['hub.challenge'])
else:
return HttpResponse('Error, invalid token')
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return generic.View.dispatch(self, request, *args, **kwargs)
# Post function to handle Facebook messages
def post(self, request, *args, **kwargs):
# Converts the text payload into a python dictionary
incoming_message = json.loads(self.request.body.decode('utf-8'))
# Facebook recommends going through every entry since they might send
# multiple messages in a single call during high load
for entry in incoming_message['entry']:
for message in entry['messaging']:
# Check to make sure the received call is a message call
# This might be delivery, optin, postback for other events
if 'message' in message:
# Print the message to the terminal
print(message)
return HttpResponse()
This is what I have in my urls.py:
# ivanteongbot/fb_ivanteongbot/urls.py
from django.conf.urls import include, url # add this
from .views import IvanTeongBotView
urlpatterns = [
url(r'^99789126bd00b5454d999cf3a9c3f8a9274d4e1460ac4b9863/?$', IvanTeongBotView.as_view())
]
Not sure what is wrong with the method declaration coz I did some googling and it seems to be declared in the right way as done my the user guide.
The tutorial you're reading leaves out a number of crucial imports, such as the one that provides method_decorator
:
from django.utils.decorators import method_decorator
It may help to follow the "View code on github" link, which takes you to a more complete file.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With