URLpattern match doesn't work as expected - django

What I want
I'm running the very first steps of the Django Project tutorial and there's already something i can't get right.
The idea behind include() is to make it easy to plug-and-play URLs. Since polls are in their own URLconf (polls/urls.py), they can be placed under “/polls/”, or under “/fun_polls/”, or under “/content/polls/”, or any other path root, and the app will still work.
I built everything as needed and my 'shelves' server works fine (debug here, running on localhost).
I'm setting the urlpatterns in shelves.urls, the first of which tries to include 'bluebook.urls'.
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('bluebook/', include('bluebook.urls')),
path('admin/', admin.site.urls),
]
When I go to http://127.0.0.1:8000/bluebook/, it works fine and loads the views.index I set up.
What doesn't work
When I go to http://127.0.0.1:8000/thebluebook/, it throws a 404. It goes as far as defining regex match not working :
Using the URLconf defined in shelves.urls, Django tried these URL patterns, in this order:
1. bluebook/
2. admin/
The current path, thebluebook/, didn't match any of these.
It does the same with http://127.0.0.1:8000/the_bluebook/ or http://127.0.0.1:8000/go/bluebook/.
What I tried
I haven't written much code so there's not much to join to this summary. Although the error message only mentions shelves.urls, i checked that bluebook.urls is set to accept any regex after the redirection from shelves.urls :
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
I checked Django Tutorial Part 1 Error: URL does not match URL patterns and tried to change ROOT_URLCONF from 'shelves.urls' to 'urls', but it throws a ERR_CONNECTION_REFUSED instead of a 404, whatever I put after http://127.0.0.1:8000/, basically the site doesn't work anymore.
I checked out Page not found 404 on Django site? but my site's urls.py is in the child folder mysite/, not the parent mysite/.
I also tried
urlpatterns = [
path('bluebook/', 'bluebook.urls'),
path('admin/', admin.site.urls),
]
but it doesn't work either.
Basically, all my setup looks right to me as calling the exact URLpattern works as expected. Only the regex matching doesn't seem to work.
FWIW, I'm using JetBrain's PyCharm to edit the code and setup the venv, without the plugin, but I don't see it influencing the running of Django code.
Python-version : Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Django version : 2.0.7
PyCharm version : 2018.1.4
Chrome version : Version 67.0.3396.99 (Official Build) (64-bit)

You didn't include 'thebluebook' in your urls. you have path('bluebook/', include('bluebook.urls')), and path('', views.index, name='index'),
which means you can do http://127.0.0.1:8000/bluebook/any/thing/here/ but you can not http://127.0.0.1:8000/any/thing/here/bluebook/.

Related

Static method returning empty list in Django

I am trying to run a Django app on local server. It works fine on mu Ubuntu machine but in mac, I can't get the CSS for
localhost:8000/admin
and
localhost:8000/docs to load.
On digging further, I found out that the static URL in main "urls.py" file
return an empty list instead of a URL pattern.
Does anyone have an idea why it is like that on the new mac system?
I have had the same issue. I was able to fix it manually by adding the following snippet to my urls.py file in the project (the urls.py file next to settings.py)...
from django.conf import settings
from django.conf.urls.static import static
from django.views.static import serve
. . .
if settings.TESTING_PRODUCTION:
urlpatterns += [
re_path(r'^static/(?P<path>.*)$', serve, {
'document_root': settings.STATIC_ROOT,
}),
]
I pulled this together from the Django Docs here.
I needed to do this so that I could test the "production" environment with manage.py runserver by manually setting DEBUG = False in settings.py which changes a few other URLs and also turns off trace printing in my code.
In my settings.py file, I have some code to set TESTING_PRODUCTION to True as well. But in actual production with a real web server, the code should set TESTING_PRODUCTION to False so that the static files can be served by the webserver directly and not through Django.

django-rest-swagger double slash

I'm having trouble with django-rest-swagger. I did everything (or I think I did) like in swagger documentation, but when I try to test API via "Try it out!" button, it sends request like this, with double slashes
"GET /api//activity/ HTTP/1.1" 404 8388
my_app/urls.py
router = routers.DefaultRouter()
router.register(r'activity', ActivityViewSet)
router.register(r'diary', DiaryViewSet)
router.register(r'discipline', DisciplineViewSet)
router.register(r'ingredient', IngredientViewSet)
router.register(r'product', ProductViewSet)
router.register(r'mealtype', MealTypeViewSet)
router.register(r'meal', MealViewSet)
urlpatterns = [
path('docs/', get_swagger_view(title='API')),
]
urlpatterns += router.urls
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('diet_app.urls'))
]
How it looks at swagger site
What could be the problem?
I ran into the same problem; it is an upstream issue for those of us who use Django 2.0. The core issue was in django rest framework versions 3.7.3 and earlier. Running following command should solves the problem
pip install --upgrade djangorestframework
If you care to see the github history, thank the people who thought through these following two tickets.
See this github ticket https://github.com/encode/django-rest-framework/issues/5686 (closed) and has been consolidated into
https://github.com/encode/django-rest-framework/issues/5675

Syntax error when manage.py runserver

I am making my first website with Python and django. Everything went well until I got a an error for no obvious reason.
It says syntax error, but I checked with django and I can see no problems.
Any help will be much appreciated.
Possibly an indentation problem? Make sure the indentation is consistent in the file and on that line.
Also post all the urls.py code please.
Your urls.py is missing a comma
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('personal.urls')) # <-- Missing Here
url(r'^blog/', include('blog.urls')),
]
Also, be sure that your URLs in personal.urls and blog.urls end in $, as well as ^admin/. As Alasdair pointed out, don't include a $ in your regexes that have an include. That is, ^blog/ remains as is, but any URLs included from blog.urls should end with a $.

404 on django app when address doesn't have extension (in mezzanine)

When I go to http://localhost:8000/getAndAnalyzePosts/index it 404s and adds a trailing slash (it does this regardless of whether I have APPEND_SLASH = True or APPEND_SLASH = False
Going to http://localhost:8000/getAndAnalyzePosts/test doesn't work but http://localhost:8000/getAndAnalyzePosts/test.anything does.
I really want to use '^$' for the index but that isn't working either.
I have this app in a mezzanine project, I haven't tried putting it into a regular django project - probably should do that next. The rest of my project works fine (using mezzanine's default apps)
getAndAnalyzePosts/urls.py
from django.conf.urls import patterns, url
from getAndAnalyzePosts import views
urlpatterns = patterns('',
url(r'^index$', views.index, name='index'),
url(r'^test.+$', views.test, name='test'),
url(r'^getSentiment$', views.getSentiment, name='getSentiment'),
)
note: getSentiment wants post variables so I am not really testing that directly
urls.py (main project)
from __future__ import unicode_literals
from django.conf.urls import patterns, include, url
from django.conf.urls.i18n import i18n_patterns
from django.contrib import admin
from mezzanine.core.views import direct_to_template
admin.autodiscover()
urlpatterns = i18n_patterns("",
("^admin/", include(admin.site.urls)),
)
urlpatterns += patterns('',
url(r"^$", direct_to_template, {"template": "index.html"}, name="home"),
(r"^", include("mezzanine.urls")),
url(r'^getAndAnalyzePosts/', include('getAndAnalyzePosts.urls', namespace="getAndAnalyzePosts")),
)
handler404 = "mezzanine.core.views.page_not_found"
handler500 = "mezzanine.core.views.server_error"
Also, I run python manage.py show_urls from django-extensions and it returns:
/getAndAnalyzePosts/getSentiment getAndAnalyzePosts.views.getSentiment getSentiment
/getAndAnalyzePosts/index getAndAnalyzePosts.views.index index
/getAndAnalyzePosts/test.+ getAndAnalyzePosts.views.test test
The project urls.py you've pasted here at some stage had some comments in great big capital letters describing the exact problem you're facing, here's their original source:
https://github.com/stephenmcd/mezzanine/blob/master/mezzanine/project_template/urls.py#L63-L66
Append slash option makes sure that if the incoming url does not have trailing slash and no url gets match, then it retires after adding trailing slash.
What it does not do is retry after removing trailing slash from incoming url.
Since incoming url does have a trailing slash, you need a / before $
Add / at the end, before $ in all your urls, (r'^getSentiment/$)
Let append slash be true and it should work.
.+ works because . in regex matching anything except newline and you added + after it so it matches any character any number of times, to match . exactly you need to escape it (.)
Making it ^text\..+$

Django include url causes rendering error?

I have a working django project. I wrote a small app - pm - and I tried to include its urls.py in the active project:
urlpatterns = patterns('',
# ... some urls here
url(r'^$', views.home, name='vw_home'),
# I added the following line:
(r'^pm/', include('pm.urls')),
Once I access the main web page, I receive the following error:
TemplateSyntaxError at /
Caught error while rendering: syntax error
and the debug shows the problem in the following line:
Home
If I remove the last url pattern (the include()), the page renders without any problem.
How can this be fixed?
EDIT:
Adding the urls.py of the pm app:
from django.conf.urls.defaults import patterns, include, url
urlpatterns = patterns("pm.views",
url(r'^inbox/$', 'inbox', {'folder': 'inbox'}, name='vw_inbox'),
url(r'^sent/$', 'inbox', {'folder': 'sent'}, name='vw_sent'),
url(r'^message/(?<message_id>\w+)/$', 'read_message', name='vw_read_message'),
url(r'^compose/(?P<profile_id>\w+)/$', 'compose_message', name='vw_compose_message'),
url(r'^reply/(?P<message_id>\w+)/$', 'compose_message', name='vw_reply_message'),
)
url(r'^message/(?<message_id>\w+)/$', 'read_message', name='vw_read_message'),
You missed ?P