🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2615閲覧

Wagtailで記事公開時に`missing 1 required positional argument: 'self'`のエラーが出てSignalが送れない

IosifHuideyeren

総合スコア12

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/09/08 00:44

編集2019/09/09 03:55

解決したいこと

現在、Django製CMSであるWagtailを使用して、ZappaでAWS Lambdaにデプロイしてサイト制作をしています。

それで、WagtailでWebHooksを送りたいのですが、これにはDjangoのSignalsの仕組みを使って送る必要があるとのことです。

参考URL:http://docs.wagtail.io/en/v2.6.1/reference/signals.html#page-published

で、以下のコードをデプロイして動かすと、以下のようなエラーが出ます。

問題が発生するまでの流れ

  1. ソースコードをZappaにてデプロイ。
  2. Article Pageを作成
  3. 更新時トリガーが走る際にエラーが発生する
  4. なお記事は普通に作成されている

環境一覧

  • Python 3.6.8
  • Django 2.1.7
  • Wagtail 2.6.1
  • Zappa 0.48.2

現在のコード

Python3

1from http.client import responses 2from django.db import models 3 4from modelcluster.fields import ParentalKey 5from modelcluster.contrib.taggit import ClusterTaggableManager 6 7from taggit.models import TaggedItemBase 8 9from wagtail.core.models import Page, Orderable 10from wagtail.admin.edit_handlers import FieldPanel, MultiFieldPanel, InlinePanel, PageChooserPanel 11from wagtail.images.edit_handlers import ImageChooserPanel 12from wagtailmarkdown.edit_handlers import MarkdownPanel 13from wagtailmarkdown.fields import MarkdownField 14 15from wagtail_graphql.models import GraphQLEnabledModel, GraphQLField 16from wagtail.core.signals import page_published, page_unpublished 17import urllib 18import logging 19import json 20import os 21 22logger = logging.getLogger() 23logger.setLevel(logging.INFO) 24 25(中略) 26 27 28class ArticlePage(GraphQLEnabledModel, Page): 29 (中略) 30 31 def send_published_signal(self, **kwargs): 32 """Sending signal when an article is published.""" 33 url = os.getenv('NETLIFY_HOOKS_URL') 34 data = {} 35 headers = { 36 'Content-Type': 'application/json', 37 } 38 req = urllib.request.Request(url, json.dumps(data).encode(), headers) 39 res = urllib.request.urlopen(req).read() 40 logger.debug(res) 41 42 page_published.send(sender=self.__class__) 43 44 def send_unpublished_signal(self, **kwargs): 45 """Sending signal when an article is unpublished.""" 46 url = os.getenv('NETLIFY_HOOKS_URL') 47 data = {} 48 headers = { 49 'Content-Type': 'application/json', 50 } 51 req = urllib.request.Request(url, json.dumps(data).encode(), headers) 52 res = urllib.request.urlopen(req).read() 53 logger.debug(res) 54 55 page_unpublished.send(sender=self.__class__) 56 57 page_published.connect(send_published_signal) 58 page_unpublished.connect(send_unpublished_signal)

エラーの内容

TypeError at /admin/pages/40/unpublish/

send_unpublished_signal() missing 1 required positional argument: 'self'

Request Method: POST
Request URL: https://admindev.huideyeren.info/admin/pages/40/unpublish/
Django Version: 2.1.7
Exception Type: TypeError
Exception Value:
send_unpublished_signal() missing 1 required positional argument: 'self'
Exception Location: /var/task/django/dispatch/dispatcher.py in <listcomp>, line 175
Python Executable: /var/lang/bin/python3.6
Python Version: 3.6.9
Python Path:
['/var/task',
'/opt/python/lib/python3.6/site-packages',
'/opt/python',
'/var/runtime',
'/var/runtime/awslambda',
'/var/lang/lib/python36.zip',
'/var/lang/lib/python3.6',
'/var/lang/lib/python3.6/lib-dynload',
'/var/lang/lib/python3.6/site-packages',
'/opt/python/lib/python3.6/site-packages',
'/opt/python',
'/var/task']
Server time: 土, 7 9月 2019 09:24:58 +0000

お手数ですが、ご教授いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

結果

ある程度はデバッグログに出力しながら実行してみることで自己解決しました。

行った対応

以下のことを対応すると、res = urllib.request.urlopen(req).read().decode('utf-8')の手前までは実行されます。

  1. import urllibだけではなく、import urllib.requestも書いておく
  2. オブジェクトの展開方法を変更する。
  3. コードの置き場をapps.pysignals.pyに移動する。

改変後のコードは以下の通りです。なお、デバッグ文を含みます。

siganals.py

Python

1import urllib 2import urllib.parse 3import urllib.request 4import logging 5import os 6 7logger = logging.getLogger(__name__) 8logger.setLevel(logging.DEBUG) 9 10 11def send_published_signal(sender, **kwargs): 12 """Sending signal when an article is published.""" 13 logger.debug('メソッドガ ヨバレタヨー') 14 instance = kwargs['instance'] 15 if os.getenv('NETLIFY_HOOKS_URL') is None: 16 url = '' 17 else: 18 url = os.getenv('NETLIFY_HOOKS_URL').__str__() 19 logger.debug('URL ハ %s ダヨー' % url) 20 values = { 21 'trigger_branch': 'published', 22 'trigger_title': '%s was published.' % instance.title 23 } 24 headers = { 25 'Content-Type': 'application/json', 26 } 27 data = urllib.parse.urlencode(values).encode() 28 logger.debug('データ デキタヨー') 29 req = urllib.request.Request(url, data, headers) 30 logger.debug('リクエスト ジュンビ デキタヨー') 31 res = urllib.request.urlopen(req).read().decode('utf-8') 32 logger.debug('リクエスト ケッカ ハ %s ダヨー' % res) 33 res = urllib.request.urlopen(req).read().decode('utf-8') 34 logger.debug('リクエスト ケッカ ハ %s ダヨー' % res) 35 36 37def send_unpublished_signal(sender, **kwargs): 38 """Sending signal when an article is unpublished.""" 39 logger.debug('メソッドガ ヨバレタヨー') 40 instance = kwargs['instance'] 41 if os.getenv('NETLIFY_HOOKS_URL') is None: 42 url = '' 43 else: 44 url = os.getenv('NETLIFY_HOOKS_URL').__str__() 45 logger.debug('URL ハ %s ダヨー' % url) 46 values = { 47 'trigger_branch': 'published', 48 'trigger_title': '%s was published.' % instance.title 49 } 50 headers = { 51 'Content-Type': 'application/json', 52 } 53 data = urllib.parse.urlencode(values).encode() 54 logger.debug('データ デキタヨー') 55 req = urllib.request.Request(url, data, headers) 56 logger.debug('リクエスト ジュンビ デキタヨー') 57 res = urllib.request.urlopen(req).read().decode('utf-8') 58 logger.debug('リクエスト ケッカ ハ %s ダヨー' % res) 59 res = urllib.request.urlopen(req).read().decode('utf-8') 60 logger.debug('リクエスト ケッカ ハ %s ダヨー' % res) 61

apps.py

Python

1from django.apps import AppConfig 2from wagtail.core.signals import page_published, page_unpublished 3from articles.signals import send_published_signal, send_unpublished_signal 4import logging 5 6 7logger = logging.getLogger(__name__) 8logger.setLevel(logging.DEBUG) 9 10 11class ArticlesConfig(AppConfig): 12 name = 'articles' 13 14 def ready(self): 15 logger.debug('シグナルヲ トウロクスルヨー') 16 page_published.connect(send_published_signal) 17 page_unpublished.connect(send_unpublished_signal) 18 logger.debug('シグナルヲ トウロクシタヨー') 19

解決できなかった問題

res = urllib.request.urlopen(req).read().decode('utf-8')のところでAPI Gatewayの30秒制限に引っかかってしまって止まってしまいます。
おそらく処理に時間がかかっているか、リクエストを受け取れていないのかのどちらかと思われます。
この件については別途質問しようと思います。

投稿2019/09/10 23:17

IosifHuideyeren

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問