質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

89.19%

Djangoのログイン実装でTypeError: __init__() takes 1 positional argument but 2 were givenが発生してしまう

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,247

Orangemikan

score 13

前提・実現したいこと

DjangoでTwitterログインを実装しようとしています。
こちらの記事を参考に実装を進めましたがエラーが発生しています。
バージョンは
Django = 2.0.6
python = 3.6.8
social-auth-app-django = 2.9.1
となっています。

発生している問題・エラーメッセージ

sudo python3 manage.py runserver 0.0.0.0:8000でサーバーの起動はできるのですがログインページにアクセスしようとすると以下のようなエラーが発生してしまいます。

[28/Jul/2019 22:31:41] "GET /user/login/ HTTP/1.1" 500 58091
Internal Server Error: /user/login/
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.6/dist-packages/django/core/handlers/base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python3.6/dist-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
TypeError: __init__() takes 1 positional argument but 2 were given

該当のソースコード

ディレクトリの構造はこのようになっています。

.
├── db.sqlite3
├── manage.py
├── spmove
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   └── wsgi.py
└── user_auth
    ├── __init__.py
    ├── __init__.pyc
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   ├── admin.cpython-36.pyc
    │   ├── models.cpython-36.pyc
    │   ├── urls.cpython-36.pyc
    │   └── views.cpython-36.pyc
    ├── admin.py
    ├── admin.pyc
    ├── apps.py
    ├── migrations
    │   ├── __init__.py
    │   └── __pycache__
    │       └── __init__.cpython-36.pyc
    ├── models.py
    ├── models.pyc
    ├── templates
    │   └── user_auth
    │       ├── login.html
    │       ├── logout.html
    │       └── top.html
    ├── tests.py
    ├── urls.py
    └── views.py


(一部文字列制限のため...で省略させて頂いています)
/usr/local/lib/python3.6/dist-packages/django/core/handlers/base.py

import logging
import types

from django.conf import settings
from django.core.exceptions import ImproperlyConfigured, MiddlewareNotUsed
from django.db import connections, transaction
from django.urls import get_resolver, set_urlconf
from django.utils.module_loading import import_string

from .exception import convert_exception_to_response, get_exception_response

...(文字列制限のため省略させていただきます...)

non_atomic_requests:
                view = transaction.atomic(using=db.alias)(view)
        return view

    def get_exception_response(self, request, resolver, status_code, exception):
        return get_exception_response(request, resolver, status_code, exception, self.__class__)

    def get_response(self, request):
        """Return an HttpResponse object for the given HttpRequest."""
        # Setup default url resolver for this thread
        set_urlconf(settings.ROOT_URLCONF)

        response = self._middleware_chain(request)

        response._closable_objects.append(request)
        if not getattr(response, 'is_rendered', True) and callable(getattr(response, 'render', None)):
            response = response.render()

        if response.status_code == 404:
            logger.warning(
                'Not Found: %s', request.path,
                extra={'status_code': 404, 'request': request},
            )

        return response

   ...


        elif hasattr(response, 'render') and callable(response.render):
            for middleware_method in self._template_response_middleware:
                response = middleware_method(request, response)

                if response is None:
                    raise ValueError(
                        "%s.process_template_response didn't return an "
                        "HttpResponse object. It returned None instead."
                        % (middleware_method.__self__.__class__.__name__)
                    )

            try:
                response = response.render()
            except Exception as e:
                response = self.process_exception_by_middleware(e, request)

        return response

    def process_exception_by_middleware(self, exception, request):
        """
        Pass the exception to the exception middleware. If no middleware
        return a response for this exception, raise it.
        """
        for middleware_method in self._exception_middleware:
            response = middleware_method(request, exception)
            if response:
                return response
        raise


/usr/local/lib/python3.6/dist-packages/django/core/handlers/exception.py

import logging
import sys
from functools import wraps

from django.conf import settings
from django.core import signals
from django.core.exceptions import (
    PermissionDenied, RequestDataTooBig, SuspiciousOperation,
    TooManyFieldsSent,
)
...

response.render()

    return response


def get_exception_response(request, resolver, status_code, exception, sender=None):
    try:
        callback, param_dict = resolver.resolve_error_handler(status_code)
        response = callback(request, **dict(param_dict, exception=exception))
    except Exception:
        signals.got_request_exception.send(sender=sender, request=request)
        response = handle_uncaught_exception(request, resolver, sys.exc_info())

    return response


...


user_auth/urls.py

import django.contrib.auth.views
from django.urls import path,include
from . import views
app_name='user_auth'

urlpatterns=[
    path('top/',views.top_page, name="top"),
    path('login/', 
         django.contrib.auth.views.LoginView,
         {
             'template_name': 'user_auth/login.html',
         },
         name='login'),
    path('logout/',
         django.contrib.auth.views.LogoutView,
         {
             'template_name': 'user_auth/logout.html',
         },
         name='logout'),
]

試したこと

このエラーが起こる前にこのようなエラーが発生していて、

  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)

...

   django.contrib.auth.views.login,
AttributeError: module 'django.contrib.auth.views' has no attribute 'login'


こちらを参考にさせていただきdjango.contrib.auth.views.logindjango.contrib.auth.views.LoginViewに、django.contrib.auth.views.logoutdjango.contrib.auth.views.LogoutViewに変更させていただくとこのエラーは消えましたが、今回のエラーを解決できなかったので質問させていただいた次第です。初心者故至らないところもありますが何卒よろしくお願い申し上げます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

私も詳しくないので不確かなのですが、

おそらく Djangoの汎用ビューを使われているので、
urls.pyのpathの部分に.as_view()が抜けているかと思います。

urlpatterns=[
    path('top/',views.top_page, name="top"),
    path('login/', 
         django.contrib.auth.views.LoginView.as_view(), #追加
         {
             'template_name': 'user_auth/login.html',
         },
         name='login'),
    path('logout/',
         django.contrib.auth.views.LogoutView.as_view(), #追加
         {
             'template_name': 'user_auth/logout.html',
         },
         name='logout'),
]

これでどうでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/10 23:53

    私も同じエラーで悩んでいましたが、「.as_view()」を付けたら解決しました。ありがとうございます。

    キャンセル

0

お世話になります。本件全く同じ記事を参考にしていました。さらにエラーも全く同じ状況です。どのように解消されたかご教示頂けないでしょうか?

TypeError: init() takes 1 positional argument but 2 were given

クラスの指定にinitがないというエラーなのは理解しているのですが、そもそもこちら側で設定したコードではない気がしています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/16 07:58

    同じく僕も行き詰まって結局flaskに変更しました...参考にならず申し訳ございません。

    キャンセル

  • 2019/09/16 08:36

    そうですかーー。全く同じエラーで全く同じ工程をすすんでいたのでとっても残念ですー

    キャンセル

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

  • ただいまの回答率 89.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる