Udostępnij za pośrednictwem


Krok 5. Uwierzytelnianie użytkowników w usłudze Django

Poprzedni krok: Używanie pełnego szablonu projektu internetowego Django

Szablon "Projekt internetowy Django" zawiera podstawowy przepływ uwierzytelniania, ponieważ uwierzytelnianie jest powszechną potrzebą aplikacji internetowych. W przypadku korzystania z dowolnego szablonu projektu Django program Visual Studio zawiera wszystkie niezbędne moduły do uwierzytelniania w pliku settings.py projektu Django.

W tym kroku nauczysz się:

  • Jak używać przepływu uwierzytelniania podanego w szablonach programu Visual Studio (krok 5–1)

Krok 5–1. Korzystanie z przepływu uwierzytelniania

Poniższe kroki wykonują przepływ uwierzytelniania i opisują części projektu:

  1. Jeśli nie wykonano jeszcze instrukcji w pliku readme.html w katalogu głównym projektu, aby utworzyć konto administratora (administratora), zrób to teraz.

  2. Uruchom aplikację z programu Visual Studio przy użyciu debugowania >Rozpocznij debugowanie (F5). Gdy aplikacja pojawi się w przeglądarce, zwróć uwagę, że w prawym górnym rogu paska nawigacji jest wyświetlane logowanie .

    Login control on the Django Web Project app page.

  3. Otwórz templates/app/layout.html i sprawdź, czy <div class="navbar ...> element zawiera {% include app/loginpartial.html %} tag . Tag {% include %} instruuje system szablonów Django, aby ściągnął zawartość dołączonego pliku w tym momencie w zawierającym szablonie.

  4. Otwórz templates/app/loginpartial.html i sprawdź, jak używa tagu warunkowego wraz z tagiem {% if user.is_authenticated %}{% else %} do renderowania różnych elementów interfejsu użytkownika w zależności od tego, czy użytkownik jest uwierzytelniony:

    {% if user.is_authenticated %}
    <form id="logoutForm" action="/logout" method="post" class="navbar-right">
        {% csrf_token %}
        <ul class="nav navbar-nav navbar-right">
            <li><span class="navbar-brand">Hello {{ user.username }}!</span></li>
            <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
        </ul>
    </form>
    
    {% else %}
    
    <ul class="nav navbar-nav navbar-right">
        <li><a href="{% url 'login' %}">Log in</a></li>
    </ul>
    
    {% endif %}
    
  5. Ponieważ podczas pierwszego uruchamiania aplikacji żaden użytkownik nie jest uwierzytelniany, kod szablonu renderuje tylko link "Zaloguj się" do względnej ścieżki "login". Jak określono w urls.py (jak pokazano w poprzedniej sekcji), trasa jest mapowana do django.contrib.auth.views.login widoku, a widok odbiera następujące dane:

    {
        'template_name': 'app/login.html',
        'authentication_form': app.forms.BootstrapAuthenticationForm,
        'extra_context':
        {
            'title': 'Log in',
            'year': datetime.now().year,
        }
    }
    

    template_name W tym miejscu zidentyfikuje szablon strony logowania, w tym przypadku templates/app/login.html. Właściwość extra_context jest dodawana do domyślnych danych kontekstowych przekazanych do szablonu. authentication_form Na koniec określa klasę formularza do użycia z identyfikatorem logowania; w szablonie jest wyświetlany jako form obiekt. Wartość domyślna to AuthenticationForm (z django.contrib.auth.views); szablon projektu programu Visual Studio używa zamiast tego formularza zdefiniowanego w pliku forms.py aplikacji:

    from django import forms
    from django.contrib.auth.forms import AuthenticationForm
    from django.utils.translation import ugettext_lazy as _
    
    class BootstrapAuthenticationForm(AuthenticationForm):
        """Authentication form which uses boostrap CSS."""
        username = forms.CharField(max_length=254,
                                   widget=forms.TextInput({
                                       'class': 'form-control',
                                       'placeholder': 'User name'}))
        password = forms.CharField(label=_("Password"),
                                   widget=forms.PasswordInput({
                                       'class': 'form-control',
                                       'placeholder':'Password'}))
    

    Jak widać, klasa formularza pochodzi z AuthenticationForm i w szczególności zastępuje pola nazwy użytkownika i hasła w celu dodania tekstu zastępczego. Szablon programu Visual Studio zawiera ten jawny kod przy założeniu, że prawdopodobnie chcesz dostosować formularz, na przykład dodanie weryfikacji siły hasła.

  6. Po przejściu do strony logowania aplikacja renderuje szablon login.html . Zmienne {{ form.username }} i {{ form.password }} renderowanie formularzy CharField z elementu BootstrapAuthenticationForm. Istnieje również wbudowana sekcja pokazująca błędy walidacji oraz gotowy element do logowania społecznościowego, jeśli zdecydujesz się dodać te usługi.

    {% extends "app/layout.html" %}
    
    {% block content %}
    
    <h2>{{ title }}</h2>
    <div class="row">
        <div class="col-md-8">
            <section id="loginForm">
                <form action="." method="post" class="form-horizontal">
                    {% csrf_token %}
                    <h4>Use a local account to log in.</h4>
                    <hr />
                    <div class="form-group">
                        <label for="id_username" class="col-md-2 control-label">User name</label>
                        <div class="col-md-10">
                            {{ form.username }}
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="id_password" class="col-md-2 control-label">Password</label>
                        <div class="col-md-10">
                            {{ form.password }}
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-md-offset-2 col-md-10">
                            <input type="hidden" name="next" value="/" />
                            <input type="submit" value="Log in" class="btn btn-default" />
                        </div>
                    </div>
                    {% if form.errors %}
                    <p class="validation-summary-errors">Please enter a correct user name and password.</p>
                    {% endif %}
                </form>
            </section>
        </div>
        <div class="col-md-4">
            <section id="socialLoginForm"></section>
        </div>
    </div>
    
    {% endblock %}
    
  7. Po przesłaniu formularza Django próbuje uwierzytelnić swoje poświadczenia (na przykład poświadczenia administratora). Jeśli uwierzytelnianie zakończy się niepowodzeniem, pozostaniesz jednak na bieżącej stronie, form.errors zostanie ustawiona wartość true. Jeśli uwierzytelnianie zakończy się pomyślnie, Django przechodzi do względnego adresu URL w polu "dalej", <input type="hidden" name="next" value="/" />czyli w tym przypadku jest to strona główna (/).

  8. Teraz, gdy strona główna zostanie ponownie renderowana, user.is_authenticated właściwość ma wartość true po renderowaniu szablonu loginpartial.html . W rezultacie zostanie wyświetlony komunikat Hello (nazwa użytkownika) i Wyloguj się. Aby sprawdzić uwierzytelnianie, możesz użyć user.is_authenticated jej w innych częściach aplikacji.

    Hello message and logoff control on the Django Web Project app page.

  9. Musisz pobrać uprawnienia specyficzne dla użytkownika z bazy danych, aby sprawdzić, czy uwierzytelniony użytkownik jest autoryzowany do uzyskiwania dostępu do określonych zasobów. Aby uzyskać więcej informacji, zobacz Using the Django authentication system (Django docs).

  10. Administrator lub administrator, w szczególności, jest autoryzowany do uzyskiwania dostępu do wbudowanych interfejsów administratora Django przy użyciu względnych adresów URL "/admin/" i "/admin/doc/". Aby włączyć te interfejsy, wykonaj poniższe kroki:

    1. Zainstaluj pakiet docutils języka Python w swoim środowisku. Doskonałym sposobem instalacji jest dodanie pliku "docutils" do pliku requirements.txt . Następnie przejdź do Eksplorator rozwiązań, rozwiń projekt, rozwiń węzeł Środowiska języka Python, a następnie kliknij prawym przyciskiem myszy używane środowisko i wybierz polecenie Zainstaluj z pliku requirements.txt.

    2. Otwórz plik urls.py projektu Django i dodaj następujące elementy:

      from django.conf.urls import include
      from django.contrib import admin
      admin.autodiscover()
      
      urlpatterns = [
          path('admin/doc/', include('django.contrib.admindocs.urls'))
      ]
      
    3. W pliku settings.py projektu Django przejdź do INSTALLED_APPS kolekcji i dodaj 'django.contrib.admindocs'element .

    4. Po ponownym uruchomieniu aplikacji możesz przejść do obszaru "/admin/" i "/admin/doc/" i wykonywać zadania, takie jak tworzenie większej liczby kont użytkowników.

      Django administrator interface.

  11. Ostatnią częścią przepływu uwierzytelniania jest wylogowanie. Jak widać w pliku loginpartial.html, link Wyloguj się po prostu wykonuje post względem względnego adresu URL "/login", który jest obsługiwany przez wbudowany widok django.contrib.auth.views.logout. Ten widok nie wyświetla żadnego interfejsu użytkownika i po prostu przechodzi do strony głównej (jak pokazano w urls.py dla wzorca "^logout$"). Jeśli chcesz wyświetlić stronę wylogowywania, najpierw zmień wzorzec adresu URL w następujący sposób, aby dodać właściwość "template_name" i usunąć właściwość "next_page":

    path('logout/',
        django.contrib.auth.views.logout,
        {
            'template_name': 'app/loggedoff.html',
            # 'next_page': '/',
        },
        name='logout')
    

    Następnie utwórz templates/app/loggedoff.html z następującą zawartością (minimalną):

    {% extends "app/layout.html" %}
    {% block content %}
    <h3>You have been logged off</h3>
    {% endblock %}
    

    Wynik zostanie wyświetlony w następujący sposób:

    Added logged off page.

  12. Gdy wszystko będzie gotowe, zatrzymaj serwer i po raz kolejny zatwierdź zmiany kontroli źródła.

Pytanie: Jaki jest cel tagu {% csrf_token %} wyświetlanego w elementach <formularza> ?

Odpowiedź: {% csrf_token %} Tag zawiera wbudowaną ochronę żądania Django między witrynami w celu fałszowania (csrf) ochrony (Django docs). Ten tag zwykle dodaje się do dowolnego elementu, który obejmuje metody żądań POST, PUT lub DELETE, takie jak formularz. Następnie funkcja renderowania szablonu (render) wstawia niezbędną ochronę.

Następne kroki

Uwaga

Jeśli w trakcie tego samouczka zatwierdzasz rozwiązanie programu Visual Studio do kontroli źródła, teraz warto wykonać kolejne zatwierdzenie. Rozwiązanie powinno być zgodne z kodem źródłowym samouczka w witrynie GitHub: Microsoft/python-sample-vs-learning-django.

Znasz już całe szablony "Blank Django Web Project" i "Django Web Project" w programie Visual Studio. Znasz już wszystkie podstawy platformy Django, takie jak używanie widoków i szablonów. Poznaliśmy również modele routingu, uwierzytelniania i używanej bazy danych. Teraz możesz utworzyć własną aplikację internetową z dowolnymi widokami i modelami, których potrzebujesz.

Uruchamianie aplikacji internetowej na komputerze deweloperów to tylko jeden krok w udostępnianiu aplikacji klientom. Następne kroki mogą obejmować następujące zadania:

  • Dostosuj stronę 404, tworząc szablon o nazwie templates/404.html. Jeśli jest obecny, Django używa tego szablonu zamiast domyślnego. Aby uzyskać więcej informacji, zobacz Widoki błędów w dokumentacji platformy Django.

  • Pisanie testów jednostkowych w tests.py; szablony projektów programu Visual Studio udostępniają punkty początkowe, a więcej informacji można znaleźć na stronie Pisanie pierwszej aplikacji Django, część 5 — testowanie i testowanie w Django w dokumentacji Django.

  • Zmień aplikację z SQLite na magazyn danych na poziomie produkcyjnym, taki jak PostgreSQL, MySQL i SQL Server (wszystkie mogą być hostowane na platformie Azure). Jak opisano w temacie When to use SQLite (sqlite.org), SQLite działa dobrze w przypadku witryn o małym i średnim natężeniu ruchu z mniej niż 100 K trafień/dzień. Jednak sqLite nie jest zalecane w przypadku większych woluminów. SqLite jest również ograniczony do jednego komputera, więc nie można go używać w żadnym scenariuszu obejmującym wiele serwerów, takich jak równoważenie obciążenia i replikacja geograficzna. Aby uzyskać informacje na temat obsługi innych baz danych przez platformę Django, zobacz Konfiguracja bazy danych. Zestaw Azure SDK dla języka Python umożliwia również pracę z usługami usługi Azure Storage, takimi jak tabele i obiekty blob.

  • Skonfiguruj potok ciągłej integracji/ciągłego wdrażania w usłudze, takiej jak Azure DevOps. Oprócz pracy z kontrolą źródła (za pośrednictwem usługi Azure Repos lub GitHub lub gdzie indziej), możesz skonfigurować projekt usługi Azure DevOps, aby automatycznie uruchamiać testy jednostkowe jako warunek wstępny do wydania. Potok można również skonfigurować do wdrożenia na serwerze przejściowym, aby uzyskać więcej testów przed wdrożeniem w środowisku produkcyjnym. Ponadto usługa Azure DevOps integruje się z rozwiązaniami do monitorowania, takimi jak App Szczegółowe informacje, i zamyka cały cykl za pomocą narzędzi do planowania zwinnego. Aby uzyskać więcej informacji, zobacz Tworzenie potoku ciągłej integracji/ciągłego wdrażania dla języka Python przy użyciu projektu usługi Azure DevOps, a także ogólną dokumentację usługi Azure DevOps.

Głębiej