2

EDIT: Kevin's answer below solved my issue. Turns out "allauth does not support namespaces" so I shouldn't have introduced this into my urls.py


ORIGINAL POST:

I have installed django-allauth exactly as per tutorials https://github.com/pennersr/django-allauth

I have a very basic problem here; can't get basic user login/out pages working even before I add in social integration.

By navigating to /admin, I clicked "log out", so I am not a logged in user.

Now when I visit /accounts/login I am met with this error

NoReverseMatch at /accounts/login/
Reverse for 'account_signup' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
Request Method: GET
Request URL:    http://localhost:5000/accounts/login/
Django Version: 1.6.5
Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'account_signup' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

Question: Do I need to modify the default allauth views.py to solve this?

In case relevant, here's the same issue when I try via shell

(awe01)MoriartyMacBookAir13:getstartapp macuser$ python manage.py shell
Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
>>> from django.core.urlresolvers import reverse
>>> reverse('account_signup')
2014-09-30 16:54:29,256 boto [DEBUG]:Using access key found in config file.
2014-09-30 16:54:29,256 boto [DEBUG]:Using secret key found in config file.
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/macuser/Dropbox/code/heroku/awe01/lib/python2.7/site-packages/django/core/urlresolvers.py", line 532, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "/Users/macuser/Dropbox/code/heroku/awe01/lib/python2.7/site-packages/django/core/urlresolvers.py", line 452, in _reverse_with_prefix
    (lookup_view_s, args, kwargs, len(patterns), patterns))
NoReverseMatch: Reverse for 'account_signup' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

Having been googling for the past hour, I don't see what I'm missing. It's supposed to work out of the box, right? I see the default base.html already seems to have the line, {% load url from future %}

To confirm, here are some extracts from my main settings.py (in folder shareducate/settings.py)

"""

"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
import dj_database_url
# from unipath import Path # that's from http://djangosteps.wordpress.com/2013/09/19/setting-up-django-allauth/
BASE_DIR = os.path.dirname(os.path.dirname(__file__))


# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

TEMPLATE_DEBUG = True

ALLOWED_HOSTS = []


TEMPLATE_CONTEXT_PROCESSORS = (
    # from http://django-allauth.readthedocs.org/en/latest/installation.html
    # Required by allauth template tags
    "django.core.context_processors.request",
    # allauth specific context processors
    "allauth.account.context_processors.account",
    "allauth.socialaccount.context_processors.socialaccount",

    # and this due to error message
    "django.contrib.auth.context_processors.auth",
)



AUTHENTICATION_BACKENDS = (
#     http://django-allauth.readthedocs.org/en/latest/installation.html 
    # Needed to login by username in Django admin, regardless of `allauth`
    "django.contrib.auth.backends.ModelBackend",

    # `allauth` specific authentication methods, such as login by e-mail
    "allauth.account.auth_backends.AuthenticationBackend",
)


# Application definition
# auth and allauth settings
LOGIN_REDIRECT_URL = '/'
SOCIALACCOUNT_QUERY_EMAIL = True
SOCIALACCOUNT_PROVIDERS = {
    'facebook': {
#        'AUTH_PARAMS': {'auth_type': 'reauthenticate'},
        'SCOPE': ['email', 'publish_stream'],
        'METHOD': 'js_sdk',  # instead of 'oauth2'
#        'LOCALE_FUNC': 'path.to.callable',
        'VERIFIED_EMAIL': False
    },
#     'google':
#         { 'SCOPE': ['https://www.googleapis.com/auth/userinfo.profile'],
#           'AUTH_PARAMS': { 'access_type': 'online' } },
#     'linkedin':
#       {'SCOPE': ['r_emailaddress'],
#        'PROFILE_FIELDS': ['id',
#                          'first-name',
#                          'last-name',
#                          'email-address',
#                          'picture-url',
#                          'public-profile-url']},
# 
}
# SOCIALACCOUNT_ENABLED = True # @MM completely made that up based on allauth urls.py and https://github.com/flashingpumpkin/django-socialregistration/issues/48

# more settings from allauth
# http://django-allauth.readthedocs.org/en/latest/configuration.html
ACCOUNT_PASSWORD_MIN_LENGTH = 5
# more suggestions from https://speakerdeck.com/tedtieken/signing-up-and-signing-in-users-in-django-with-django-allauth
# ACCOUNT_AUTHENTICATION_METHOD = "username"

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'storages', # http://django-storages.readthedocs.org/en/latest/
    'polls',
    'discover',
    'hello',
    'upload', # from https://github.com/Widen/fine-uploader-server/blob/master/python/django-fine-uploader-s3/settings.py
    'south', # http://south.readthedocs.org/en/latest/tutorial/part1.html
    # The Django sites framework is required
    'django.contrib.sites',

    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    # ... include the providers you want to enable:

    'allauth.socialaccount.providers.facebook',

    'allauth.socialaccount.providers.linkedin',

    'allauth.socialaccount.providers.twitter',

)

SITE_ID = 5 # this corresponds to "127.0.0.1:5000" since I use heroku's foreman start to run things locally
# Not sure about this
# check out https://searchcode.com/codesearch/view/263279/
# I looked at tables. Ran "select * from django_site and it showed that awedify.org was id num 2
# awedify.org # originally just the single character, 1
# that from http://django-allauth.readthedocs.org/en/latest/installation.html

# from http://django-storages.readthedocs.org/en/latest/backends/amazon-S3.html
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
# Note I also specify boto in STATICFILES_STORAGE later down this file





#    Added and removed when trying fineuploader
ADMINS = (
    ('Mark', 'm@domain.com'),
    # ('Your Name', 'your_email@example.com'),
)



MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'shareducate.urls'

WSGI_APPLICATION = 'shareducate.wsgi.application'


ALLOWED_HOSTS = ['*']

TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'templates'),
         'polls/templates/polls',
         'upload/templates/upload',
         # 'polls/templates/polls',
         'messing/templates/messing',
         'discover/templates/discover',
         'allauth/templates/allauth',
        # or see http://djangosteps.wordpress.com/2013/09/19/setting-up-django-allauth/

)

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)


EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 
# from http://stackoverflow.com/questions/21563227/django-allauth-example-errno-61-connection-refused

I have modified shareducate/urls.py url(r'^accounts/', include('allauth.urls', namespace='allauth')), but I haven't modified anything inside the allauth folder

Note: by going to /admin, I can log in as the super user. Then sure enough, visiting /accounts/login redirected me to root /, as per settings.py And if I commented out that line, # LOGIN_REDIRECT_URL = '/' then sure enough I would get directed to /accounts/profile/ as per http://stackoverflow.com/a/16956071/870121

Now that I am logged out though (which I achieved via the /admin interface), the allauth program doesn't seem to be able to deal with me when I visit /accounts/login

Note /allauth/templates/account/login.html looks like this... I haven't edited it at all

{% extends "account/base.html" %}

{% load i18n %}
{% load account %}
{% load url from future %}

{% block head_title %}{% trans "Sign In" %}{% endblock %}

{% block content %}

<h1>{% trans "Sign In" %}</h1>

{% if socialaccount.providers  %}
<p>{% blocktrans with site.name as site_name %}Please sign in with one
of your existing third party accounts. Or, <a href="{{ signup_url }}">sign up</a>
for a {{site_name}} account and sign in below:{% endblocktrans %}</p>

<div class="socialaccount_ballot">

  <ul class="socialaccount_providers">
    {% include "socialaccount/snippets/provider_list.html" with process="login" %}
  </ul>

  <div class="login-or">{% trans 'or' %}</div>

</div>

{% include "socialaccount/snippets/login_extra.html" %}

{% else %}
<p>{% blocktrans %}If you have not created an account yet, then please
<a href="{{ signup_url }}">sign up</a> first.{% endblocktrans %}</p>
{% endif %}

<form class="login" method="POST" action="{% url 'account_login' %}">
  {% csrf_token %}
  {{ form.as_p }}
  {% if redirect_field_value %}
  <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
  {% endif %}
  <a class="button secondaryAction" href="{% url 'account_reset_password' %}">{% trans "Forgot Password?" %}</a>
  <button class="primaryAction" type="submit">{% trans "Sign In" %}</button>
</form>

{% endblock %}

GUESS

(1)

Based on this answer http://stackoverflow.com/a/13202435/870121 I think I may have to modify line 109 in this allauth/accounts/views.py

84 class LoginView(RedirectAuthenticatedUserMixin,
 85                 AjaxCapableProcessFormViewMixin,
 86                 FormView):
 87     form_class = LoginForm
 88     template_name = "account/login.html"
 89     success_url = None
 90     redirect_field_name = "next"
 91 
 92     def get_form_class(self):
 93         return get_form_class(app_settings.FORMS, 'login', self.form_class)
 94 
 95     def form_valid(self, form):
 96         success_url = self.get_success_url()
 97         return form.login(self.request, redirect_url=success_url)
 98 
 99     def get_success_url(self):
100         # Explicitly passed ?next= URL takes precedence
101         ret = (get_next_redirect_url(self.request,
102                                      self.redirect_field_name)
103                or self.success_url)
104         return ret
105 
106     def get_context_data(self, **kwargs):
107         ret = super(LoginView, self).get_context_data(**kwargs)
108         signup_url = passthrough_next_redirect_url(self.request,
109                                                    reverse("account_signup"),
110                                                    self.redirect_field_name)
111         redirect_field_value = self.request.REQUEST \
112             .get(self.redirect_field_name)
113         ret.update({"signup_url": signup_url,
114                     "site": Site.objects.get_current(),
115                     "redirect_field_name": self.redirect_field_name,
116                     "redirect_field_value": redirect_field_value})
117         return ret
118 
119 login = LoginView.as_view()

You see it has the reverse("account_signup") with no extra arguments I have not edited this as I thought allauth was supposed to work out of the box and am relantant to break things by tinkering

That line is highlighted in the full traceback error. Traceback:

File "/Users/macuser/Dropbox/code/heroku/awe01/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/macuser/Dropbox/code/heroku/awe01/lib/python2.7/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "/Users/macuser/Dropbox/code/heroku/awe01/getstartapp/allauth/account/views.py" in dispatch
  62.                                             **kwargs)
File "/Users/macuser/Dropbox/code/heroku/awe01/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "/Users/macuser/Dropbox/code/heroku/awe01/lib/python2.7/site-packages/django/views/generic/edit.py" in get
  161.         return self.render_to_response(self.get_context_data(form=form))
File "/Users/macuser/Dropbox/code/heroku/awe01/getstartapp/allauth/account/views.py" in get_context_data
  109.                                                    reverse("account_signup"),
File "/Users/macuser/Dropbox/code/heroku/awe01/lib/python2.7/site-packages/django/core/urlresolvers.py" in reverse
  532.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "/Users/macuser/Dropbox/code/heroku/awe01/lib/python2.7/site-packages/django/core/urlresolvers.py" in _reverse_with_prefix
  452.                              (lookup_view_s, args, kwargs, len(patterns), patterns))

(2) Is SITE_ID important for this, or just for social integration?

Please advise of trouble-shooting steps which might make sense from here. Thanks in advance, M

Mark
  • 907
  • 14
  • 24
  • 1
    It says 0 patterns matched, which is a red flag. My guess is, something is off in your root url conf. – karthikr Sep 30 '14 at 18:00
  • Correct you were, I had deviated from the tutorial hours ago and Kevin correctly pointed out the exact error below. Thanks so much! – Mark Sep 30 '14 at 18:34

1 Answers1

20

Let me present this answer with some debugging tips that hopefully will prove useful in the future.

When you see that particular Django error, it almost always means that something is wrong with your urls.py. The odds that such a widely-used package has a bug affecting such basic usage is pretty remote, so digging into the source code was probably wasted effort in this case.

You said that you installed django-allauth "exactly as per tutorials", but when I compare your setup to the documentation I see this difference:

Documentation: (r'^accounts/', include('allauth.urls'))

You: (r'^accounts/', include('allauth.urls', namespace='allauth'))

So it appears that something is wrong with your use of namespacing.

A quick Google search pulls up this issue, where the package author explains that namespacing isn't supported.

So if you get rid of the namespace argument, everything should work as expected.

Kevin Christopher Henry
  • 37,093
  • 5
  • 98
  • 87
  • 6
    I've exposed myself as a blatent liar. Thank you so much for ending my troubles here. Yes, I modified that namespace argument as part of trouble-shooting hours ago and forgot I had done so. Deleting it did indeed solve my problem. You have restored my night and some glimmer of self worth -- thank you! – Mark Sep 30 '14 at 18:35
  • 9
    @Mark: Happy to help, sometimes it just takes a fresh pair of eyes. – Kevin Christopher Henry Sep 30 '14 at 19:02
  • 1
    @KevinChristopherHenry What a thoughtful and helpful response! I wish all answers on SO were like this :) – Bleh May 12 '18 at 02:16