Djangorestframework - ModuleNotFound

Django, Flask, Bottle, WSGI, CGI…
Antworten
robin_
User
Beiträge: 48
Registriert: Montag 3. August 2020, 17:59

Hallo zusammen, da das mein erster Post ist:

Ich heiße Robin und habe kürzlich angefangen das Buch "Learn Web Development with Python" durchzuarbeiten.

Mittlerweile bin ich durch den allgemeinen Python-Teil durch und habe Probleme, das erste Beispiel mit Django/ REST_Framework ans laufen zu bekommen.


Das Model steht, es geht jetzt um die Serialisierung.

Ich habe also, wie im Buch beschrieben, die Datei serializations.py erstellt, hierbei scheitere ich beim import, der absolut nicht funktionieren will.

Code: Alles auswählen

form rest_framwork import serializations
Was ich probiert habe:
  • in den "INSTALLED_APPS" ist das framework eingebunden (settings.py)
  • Das Framework mehrmals installiert, teilweise in der Python venv, teilweise Global
  • Neben Visual Studio Code hab ich noch Sublime Text3 runtergeladen, bei beiden das gleiche Problem
  • In der Python Shell (PowerShell - > Python) versucht, rest_framework zu importieren --> Ebenfalls ModuleNOtFound
  • Mit "pip freeze" wird mir folgendes angezeigt (Meiner Meinung nach müsste es also installiert sein, in der venv
Bild
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Poste den Code, den du tatsächlich verwendest. Copy&Paste. Keinen der "ungefähr so aussieht".

Poste die Fehlermeldung inklusive Traceback zwischen Code-Tags.

Die Ausgabe von pip freeze ebenfalls Copy&Paste zwischen Code-Tags.

Pip ruft man immer mit dem richtigen Interpreter auf, wenn man es als Modul und nicht als Programm aufruft:

Code: Alles auswählen

c:\pfad\zur\python.exe -m pip argumente
robin_
User
Beiträge: 48
Registriert: Montag 3. August 2020, 17:59

Vielen Dank für die schnelle Antwort!

Also einen Fehler hab ich schon gefunden (glaube ich), es war in VS Code ein falscher Interpreter eingestellt. Habe ihn auf folgenden Umgestellt (hoffe das ist korrekt):

Code: Alles auswählen

C:\Users\Robin\HillarDjangoREST\01\Scripts\python.exe
Aber erstmal zur PowerShell. Hier die ausgeführten Befehle:
Bild

Nun zum Code. Die Django App heißt "toys".
Der Fehler tritt in

Code: Alles auswählen

C:\Users\Robin\HillarDjangoREST\01\restful01\toys\serializers.py
auf:

Code:

Code: Alles auswählen

from rest_framework import serializers
from toys.models import Toy
Output von VS in der Python Debug Console:

Code: Alles auswählen

PS C:\Users\Robin\HillarDjangoREST\01\restful01\toys>  & 'c:\Users\Robin\HillarDjangoREST\01\Scripts\python.exe' 'c:\Users\Robin\.vscode\extensions\ms-python.python-2020.7.96456\pythonFiles\lib\python\debugpy\launcher' '61832' '--' 'c:\Users\Robin\HillarDjangoREST\01\restful01\toys\serializers.py'
Traceback (most recent call last):
  File "C:\Python38\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "c:\Users\Robin\.vscode\extensions\ms-python.python-2020.7.96456\pythonFiles\lib\python\debugpy\__main__.py", line 45, in <module>
    cli.main()
  File "c:\Users\Robin\.vscode\extensions\ms-python.python-2020.7.96456\pythonFiles\lib\python\debugpy/..\debugpy\server\cli.py", line 430, in main    
    run()
  File "c:\Users\Robin\.vscode\extensions\ms-python.python-2020.7.96456\pythonFiles\lib\python\debugpy/..\debugpy\server\cli.py", line 267, in run_file
    runpy.run_path(options.target, run_name=compat.force_str("__main__"))
  File "C:\Python38\lib\runpy.py", line 265, in run_path
    return _run_module_code(code, init_globals, run_name,
  File "C:\Python38\lib\runpy.py", line 97, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "C:\Python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "c:\Users\Robin\HillarDjangoREST\01\restful01\toys\serializers.py", line 3, in <module>
    from rest_framework import serializers
  File "C:\Users\Robin\HillarDjangoREST\01\lib\site-packages\rest_framework\serializers.py", line 28, in <module>
    from rest_framework.compat import postgres_fields
    from django.contrib.postgres import fields as postgres_fields
  File "C:\Users\Robin\HillarDjangoREST\01\lib\site-packages\django\contrib\postgres\fields\__init__.py", line 1, in <module>
    from .array import *  # NOQA
  File "C:\Users\Robin\HillarDjangoREST\01\lib\site-packages\django\contrib\postgres\fields\array.py", line 3, in <module>
    from django.contrib.postgres import lookups
  File "C:\Users\Robin\HillarDjangoREST\01\lib\site-packages\django\contrib\postgres\lookups.py", line 4, in <module>
    from .search import SearchVector, SearchVectorExact, SearchVectorField
  File "C:\Users\Robin\HillarDjangoREST\01\lib\site-packages\django\contrib\postgres\search.py", line 47, in <module>
    class SearchVector(SearchVectorCombinable, Func):
  File "C:\Users\Robin\HillarDjangoREST\01\lib\site-packages\django\contrib\postgres\search.py", line 50, in SearchVector
    _output_field = SearchVectorField()
  File "C:\Users\Robin\HillarDjangoREST\01\lib\site-packages\django\db\models\fields\__init__.py", line 172, in __init__
    self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE
  File "C:\Users\Robin\HillarDjangoREST\01\lib\site-packages\django\conf\__init__.py", line 56, in __getattr__
    self._setup(name)
  File "C:\Users\Robin\HillarDjangoREST\01\lib\site-packages\django\conf\__init__.py", line 35, in _setup
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
PS C:\Users\Robin\HillarDjangoREST\01\restful01\toys> & c:/Users/Robin/HillarDjangoREST/01/Scripts/Activate.ps1
(01) PS C:\Users\Robin\HillarDjangoREST\01\restful01\toys> 
Hier der Code von models.py:

Code: Alles auswählen

from django.db import models

class Toy(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    name = models.CharField(max_length=150, blank=False, default='')
    description = models.CharField(max_length=250, blank=True, default='')
    toy_category = models.CharField(max_length=200, blank=False, default='')
    release_date = models.DateTimeField()
    was_included_in_home = models.BooleanField(default=False)

    class Meta:
        ordering = ('name',)
        
Und nun zum Abschluss noch der Bereich aus der settings.py des Projekt-Ordners

Code: Alles auswählen

INSTALLED_APPS = [
    'rest_framework',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    'toys.apps.ToysConfig',
]
Ich kriege nun nicht mehr den ModulNotFound-Error (das liegt mit der anderen Interpreter-Einstellung zusammen, wie anfangs erläutert).

Ich glaube ich habe einen systematischen Fehler bei der Benutzung der virtuellen Umgebung. Leider ist das Buch da nicht wirklich aussagekräftig.

Danke für die Mühe!
robin_
User
Beiträge: 48
Registriert: Montag 3. August 2020, 17:59

P.S.:

Hier noch die PS als Code:

Code: Alles auswählen

PS C:\Users\Robin> python -m venv C:\Users\Robin\HillarDjangoREST\01
PS C:\Users\Robin> pushd .\HillarDjangoREST\01
PS C:\Users\Robin\HillarDjangoREST\01> .\Scripts\activate
(01) PS C:\Users\Robin\HillarDjangoREST\01> pip freeze
astroid==2.4.2
colorama==0.4.3
Django==1.11.29
djangorestframework==3.11.0
isort==4.3.21
lazy-object-proxy==1.4.3
mccabe==0.6.1
pylint==2.5.3
pytz==2020.1
six==1.15.0
toml==0.10.1
wrapt==1.12.1
(01) PS C:\Users\Robin\HillarDjangoREST\01>

Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Also ich sehe in dem StackTrace kein "ModuleNotFound" (deshalb ist es auch wichtig den zu zeigen), sondern die letzten Zeilen sagen ja, dass da etwas nicht richtig konfiguriert wurde.

War genau hast du mit dem Commandozeilenaufruf eigentlich vor? Startet man Django-Projekte bzw. deren Entwicklungsserver nicht, indem man die manage.py startet?
robin_
User
Beiträge: 48
Registriert: Montag 3. August 2020, 17:59

Ja wie gesagt, das ModuleNotFound ist weg durch die andere Auswahl des Interpreters in VS Code.

Was ich vor hatte war 1.) die Umgebung starten und 2). überprüfen, ob djangorestframework in der Umgebung installiert ist.
Ehrlich gesagt hatte ich die manage.py bisher nur benutzt, um das Model zu integrieren.

Wie gesagt, ich bin noch am Anfang damit und ich gehe davon aus, dass das ganze dann (local) noch getestet/ gestartet wird. Aber soweit kam ich bisher nicht, weil ich eben die Fehler in VS habe
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Nochmal meine Frage: Was genau tust du da? Also was hast du vor?
Warum führst du die Datei serializers.py aus? Hat das einen Grund?

Es ist ja eine Webanwendung.
Und normalerweise startet man einen Webserver um darauf per Browser zugreifen zu können.
Und den startet man über die manage.py.

Es gibt ein ziemlich gutes Tutorial, das du dir anschauen solltest. Lass dich nicht abschrecken nur weil die Seite "djangogirls" heißt.
robin_
User
Beiträge: 48
Registriert: Montag 3. August 2020, 17:59

Danke, das Tutorial werde ich mir reinziehen.
Warum führst du die Datei serializers.py aus? Hat das einen Grund?
Ich habe ein wenig Erfahrung mit Objective C. Ich habe serializers.py ausgeführt, um zu testen, ob der Import hinhaut. Für mich äquivalent zum Builden einer Klasse, daher mein versuch, das Modul direkt auszuführen.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Halte Dich doch einfach an das Vorgehen, das in den Tutorials beschrieben wird. Django erwartet, dass man sehr strikte Vorgaben einhält.
robin_
User
Beiträge: 48
Registriert: Montag 3. August 2020, 17:59

Hi, ich hänge gerade an einem neuen Problemchen, soweit bin ich ganz gut voran gekommen :)
(Ich glaube ein neuer Thread wäre ein wenig Overkill)

In meinem Buch gehts gerade darum, die Browsing API zu benutzen.

Nun, das Problem ist, dass ich beim Aufruf von

Code: Alles auswählen

http://localhost:8000
404 zurück bekomme. Eigentlich sollte ich die Ansicht von Api Root bekommen...
Die Seite selbst sieht so aus:

Code: Alles auswählen

Page not found (404)
Request Method:	GET
Request URL:	http://localhost:8000/
Using the URLconf defined in restful01.urls, Django tried these URL patterns, in this order:

^ ^toys/$
^ ^toys/(?P<pk>[0-9]+)$
The empty path didn't match any of these.

You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
Dazu sei gesagt, dass die Aufrufe

Code: Alles auswählen

http://localhost:8000/toys/
bzw.

Code: Alles auswählen

http://localhost:8000/toys/2
funktionieren.
Was mich wundert (und das hab ich gerade nochmal überprüft, ist die Tatsache, dass meine urls.py-files identisch zum Buch sind:

Vom Projekt:

Code: Alles auswählen

#restful01/restful01/urls.py
from django.conf.urls import url, include

urlpatterns = [
    url(r'^', include('toys.urls')),
]

und die Datei von der App:

Code: Alles auswählen

#restful01/toys/urls.py

from django.conf.urls import url
from toys import views

urlpatterns = [
    url(r'^toys/$', views.toy_list),
    url(r'^toys/(?P<pk>[0-9]+)$', views.toy_detail),
    
]

Also für meinen Begriff ist das entsprechende urlpattern nicht definiert. Vielleicht hat jemand ne Idee, warum es im Buch klappt, obwohl die Dateien identisch sind bzw. eine Änderung, womit ich das ans laufen kriegen?

Vielen Dank schon Mal für eure Mühen. LG
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Was soll denn da klappen? Was ist die API-Root? Du hast nur URLs nach /toys definiert. Sonst nichts.
robin_
User
Beiträge: 48
Registriert: Montag 3. August 2020, 17:59

Ich habe es so verstanden, dass es eine Standard-Seite sein soll.

Ich glaube ich hab mich vertan. Es scheint so, als wäre das, was ich machen soll (bzw. der Aufruf, der nicht klappt) aus einem anderen Beispielprojekt, welches noch nicht vorgestellt wurde bzw. geschrieben wurde... insofern scheint mir das evt. ein Fehler im Buch zu sein; vielleicht kommt es ja noch. Danke!
Antworten