Aracılığıyla paylaş


Öğretici: Visual Studio'da Django ile kullanıcıların kimliğini doğrulama

Bu makalede, Visual Studio 'da Django web çerçevesiyle çalışmaöğretici serisinin 5. adımı verilmiştir.

Kimlik doğrulaması, web uygulamaları için yaygın bir gereksinimdir. Visual Studio'daki Django Web Project şablonu, Django projesinin settings.py dosyasında kimlik doğrulaması için gerekli tüm modülleri sağlar. Bu öğretici serisinin 4. adımı, bu şablonu kullanarak bir Django web uygulaması oluşturur. 5. Adım'da şablonun kimlik doğrulama özelliklerini keşfedecek ve çalışan uygulamadaki özelliklerle çalışacaksınız.

Öğreticinin 5. Adımında şunların nasıl yapılacağını öğreneceksiniz:

  • Visual Studio'da Django Web Projesi şablonunda kimlik doğrulama akışını keşfetme
  • Kimlik doğrulama işlemini destekleyen kodu inceleme
  • Django yönetici arabirimlerine erişimi etkinleştirmek için kodu değiştirme
  • Django web uygulamasını çalıştırma ve kimlik doğrulama özelliklerini kullanma

Önkoşullar

  • Django Web Project şablonunu (DjangoWeb) temel alan bir Visual Studio çözümü ve Django web uygulaması. 4. Adım: Tam Django Web Projesi şablonunu kullanın bu uygulamanın nasıl oluşturulacağını açıklar.

  • Django web uygulamasının bir süper kullanıcı (yönetici) hesabı olmalıdır. Adım 4 (Django süper kullanıcı oluşturma) süper kullanıcı kimlik bilgilerinin nasıl oluşturulacağını açıklar.

  • Django şablon sürümleri, Visual Studio projeleri ve Django projeleri ve Mac'te Python geliştirme hakkında ayrıntılı bilgi için bu öğretici serisinin 1. Adımındaki Önkoşullar bölümünü gözden geçirin.

Kimlik doğrulama akışını keşfetme

Bu bölümde, Django web uygulaması için Django Web Project şablonu tarafından sağlanan varsayılan kimlik doğrulama akışı açıklanmaktadır.

  1. Visual Studio'da, Hata Ayıklama>Hata Ayıklamayı Başlat (F5) seçeneğini seçerek Django web uygulamasını (DjangoWeb) başlatın.

  2. Uygulama tarayıcıda açıldığında, gezinti çubuğunun sağ tarafındaki Oturum aç seçeneğine dikkat edin:

    Çalışan Django web uygulamasındaki gezinti çubuğunda oturum aç seçeneğini gösteren ekran görüntüsü.

    Çalışan Django uygulamasında, Ana Sayfa, Hakkındave İletişimolmak üzere üç sayfa seçeneği bulunan bir gezinme çubuğu ve Oturum Aç seçeneği vardır. Kimlik doğrulama yapılandırması, herhangi bir kullanıcının içeriği "Giriş", "Hakkında" ve "Kişi" sayfalarında görmesine olanak tanır.

  3. Django web uygulamasına kimliği doğrulanmış erişim için, belirlenen bir süper kullanıcı "Oturum aç" sayfasını açan Oturum aç seçeneğini kullanabilir:

    Çalışan Django web uygulamasındaki süper kullanıcının Oturum açma kimlik doğrulaması sayfasını gösteren ekran görüntüsü.

  4. Süper kullanıcı oturum açtıktan sonra site için kısıtlı sayfa görünümlerine erişebilir ve yönetim görevlerini tamamlayabilir:

    Django süper kullanıcısının kullanabileceği sayfa görünümlerinden birini ve Oturumu kapat seçeneğiyle güncelleştirilmiş gezinti çubuğunu gösteren ekran görüntüsü.

  5. Süper kullanıcı, Django web uygulamasının oturumunu kapatmak ve kimliği doğrulanmamış bir kullanıcı olarak Django web uygulamasının "Giriş" sayfasına dönmek için Oturumu kapat seçeneğini kullanabilir.

Aşağıdaki bölümlerde, kimlik doğrulama yapılandırmasını süper kullanıcı için Django yönetim sitesi erişimini destekleyecek şekilde değiştireceksiniz.

Kimlik doğrulama kodunu inceleme

Bir Django web uygulamasının genel kimlik doğrulama özelliklerini anladığınıza göre, Django Web Projesi şablonu tarafından sağlanan temel kodu incelemeye hazırsınız:

  1. Çözüm Gezginibölümünde projenin app/templates/app klasörünü genişletin. Aşağıdaki adımlar bu klasördeki birkaç dosyayı gözden geçirir.

  2. layout.htmltemel şablon dosyasını açın. <div class="navbar ...> öğesine kaydırın ve {% include app/loginpartial.html %} etiketini bulun.

    {% include %} etiketi, Django'nun şablon sistemine bu noktada, içeren şablonda dahil edilen dosyanın içeriğini çekmesini talep eder.

  3. loginpartial.html dosyasını açın. Bu şablonun, kullanıcının kimliğinin doğrulanıp doğrulanmamış olmasına bağlı olarak farklı kullanıcı arabirimi öğelerini işlemek için {% else %} etiketiyle birlikte koşullu etiket {% if user.is_authenticated %} nasıl kullandığını gözlemleyin:

    {% 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 %}
    
  4. Uygulamayı başlattığınızda, hiçbir süper kullanıcının kimliği doğrulanmamıştır ve şablon kodu yalnızca Oturum açma bağlantısını işler. Bağlantının hedefi, Adım 4 (URL yönlendirme desenlerini inceleyin)'te açıklandığı gibi, Django projesinin URL dosyasında (DjangoWeb/DjangoWeb/urls.py) belirtilen siteye göreli "giriş" yoludur. "Oturum açma" yolu django.contrib.auth.views.login görünümüne eşlenir ve görünüm aşağıdaki verileri alır:

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

    Bu kod üç özelliği tanımlar:

    • template_name, uygulaması/login.html dosyasında tanımlanan "Oturum aç" sayfasının şablonunu tanımlar. Bu bağlantının site göreli olduğunu unutmayın. Tam klasör yolu app/templates/app/login.htmlşeklindedir.

    • extra_context, şablona verilen varsayılan bağlam verilerine bilgi ekler. Bu durumda, bilgiler tarih, saat ve yılla birlikte bir "Oturum aç" başlığı içerir.

    • authentication_form, oturum açma yordamıyla kullanılacak bir form sınıfı belirtir. Şablonda, bu özellik değeri form nesnesi olarak görünür. Varsayılan değer AuthenticationForm 'dir (django.contrib.auth.views), ancak Visual Studio proje şablonu bunun yerine projenin uygulamasında/forms.py dosyasında tanımlanan formu kullanır:

      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 bootstrap 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'}))
      

      Form sınıfı AuthenticationForm'dan türetilir ve özellikle kullanıcı adı ve parola alanlarını yer tutucu metin eklemek için geçersiz kılar. Visual Studio şablonu, parola gücü doğrulaması ekleme gibi formu özelleştirmek isteyebileceğiniz varsayımı üzerine bu açık kodu içerir.

  5. Uygulamayla kullanıcı etkileşimi "Oturum aç" sayfasını açtığında, uygulama login.html şablonunu işler. değişkenler {{ form.username }} ve {{ form.password }}BootstrapAuthenticationForm sınıfından CharField formlarını işler. Ayrıca doğrulama hatalarını gösteren yerleşik bir bölüm ve bu hizmetleri eklemeyi seçerseniz sosyal oturum açma işlemleri için hazır bir öğe vardır:

    {% 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 %}
    
  6. Kullanıcı sayfa formunda Oturum aç seçtiğinde Django, süper kullanıcının kimlik bilgileri gibi kimlik bilgilerinin kimliğini doğrulamayı dener:

    • Kimlik doğrulaması başarısız olursa, kullanıcı "Oturum aç" sayfasında kalır ve form.errors etiketi true olarak ayarlanır:

      Kullanıcı Django oturum açma işlemine yanlış kimlik bilgileri girdiğinde iletiyi gösteren ekran görüntüsü.

    • Kimlik doğrulaması başarılı olursa, Django göreli URL'yi next alanında açar( <input type="hidden" name="next" value="/" />), bu durumda "Giriş" sayfasıdır (/).

  7. Kullanıcının kimliği doğrulandıktan sonra loginpartial.html şablonu görüntülendiğinde, uygulama "Giriş" sayfasını gösterirken user.is_authenticated özelliği doğru olur. Bu durumda gezinti çubuğunda Hello (kullanıcı adı) iletisi gösterilir ve Oturumu kapat seçeneği Oturum aç seçeneğinin yerini alır:

    Hello iletisi ve Oturumu kapat seçeneğiyle kimliği doğrulanmış kullanıcının güncelleştirilmiş gezinti çubuğunu gösteren ekran görüntüsü.

    Kimlik doğrulamasını denetlemek için uygulama kodunun diğer bölümlerindeki user.is_authenticated özelliğini kullanabilirsiniz.

Django yönetici arabirimlerine erişme

Kimliği doğrulanmış kullanıcının belirli kaynaklara erişme yetkisi olup olmadığını denetlemek için veritabanınızdan kullanıcıya özgü izinleri almanız gerekir.

Özellikle süper kullanıcı veya yönetici, /admin/ ve /admin/doc/site göreli URL'lerini kullanarak yerleşik Django yönetici arabirimlerine erişme yetkisine sahiptir. Daha fazla bilgi için bkz. Django kimlik doğrulama sistemi kullanma (Django belgeleri).

Django yönetici arabirimlerine erişimi etkinleştirmek için şu adımları izleyin:

  1. docutils Python paketini ortamınıza yükleyin. Yönergeler için bkz. Python ortamı için paketleri yükleme.

  2. Çözüm GezginiDjango proje klasörünü genişletin DjangoWeb/DjangoWeb/. Aşağıdaki adımlar bu klasördeki birkaç dosyayı güncelleştirir.

  3. Django projesinin urls.py dosyasını açın ve içeriği aşağıdaki gibi değiştirin:

    1. Geçerli listenin sonuna eklemek üzere dosyanın üst kısmına URL'ler için aşağıdaki paket içeri aktarmayı ekleyin:

      from django.conf.urls import include
      
    2. İçeri aktarma listesinden sonra aşağıdaki deyimi ekleyin:

      admin.autodiscover()
      
    3. urlpatterns tanımını bulun ve 'admin/' girdisini önce aşağıdaki yol girdisini ekleyin:

      path('admin/doc/', include('django.contrib.admindocs.urls')),
      
  4. Django projesinin settings.py dosyasını açın ve INSTALLED_APPS koleksiyonunu bulun. girdisinden hemen sonra app girdisine aşağıdaki girdiyi ekleyin:

    'django.contrib.admindocs',
    
  5. Django web uygulamasını durdurun ve yeniden başlatın.

  6. Tarayıcının URL adresi alanında, uygulamanın sayfa görünümünü /admin/ veya /admin/doc/ yolu olarak değiştirin. Bu sayfalar süper kullanıcıya kullanıcı veya grup hesapları oluşturma, parolayı değiştirme ve Django belgelerini görüntüleme gibi Django yönetim görevlerine erişim sağlar:

    Django web uygulamasında kimliği doğrulanmış süper kullanıcı için Django belgeleri için örnek sayfa görünümünü gösteren ekran görüntüsü.

Oturumu kapatma davranışını keşfetme

Süper kullanıcının oturumu kapatıp yetkilendirilmiş oturumu sonlandırmasının iki yolu vardır. Django web uygulaması gezinti çubuğunda Oturumu kapat seçeneğini içerir ve Django yönetim sitesi Oturumu Kapat seçeneğini sağlar.

Django yönetim sitesinden oturumunu kapatma

Süper kullanıcı Django yönetim sitesindeki sayfaları görüntülüyorsa, site gezinti çubuğunda Oturumu kapat seçebilir. Tarayıcı, sitenin "Oturumu kapatıldı" sayfasını gösterecek şekilde yenilenir:

Django yönetici sitesinden süper kullanıcının oturumunu kapattıktan sonraki çıkış sayfasını gösteren ekran görüntüsü.

Bu sayfada kullanıcının iki seçeneği vardır: Ana Sayfa ve Yeniden oturum aç. Her iki seçenek de kullanıcıyı Django yönetim sitesinin (/admin) "Giriş" sayfasına döndürür ve kullanıcıdan kimlik bilgilerini yeniden girmeniz istenir.

Django yönetim sitesinin Oturum Aç iletişim kutusunu gösteren ekran görüntüsü.

Django web uygulamasında oturumu kapatma

Süper kullanıcı Django web uygulamasında "Hakkında" veya "İletişim" gibi sayfaları görüntülüyorsa, Django web uygulaması gezinti çubuğunda Oturumu kapat seçebilir. Oturumu kapatma davranışı çok azdır. Yalnızca kimliği doğrulanmış oturumu sona erdirir ve kullanıcıyı uygulama "Giriş" sayfasına geri gönderir.

Kullanıcı için daha bilgilendirici olması için oturum kapatma davranışını yeniden çalışabilirsiniz:

  1. Çözüm Gezginibölümünde projenin app/templates/app klasörünü genişletin ve loginpartial.html dosyasını açın.

  2. Şablon dosyasında, Oturumu kapat bağlantısının yalnızca site göreli URL yolu "/login" (href="{% url 'login' %}") için bir HTTP POST (action="/logout" method="post") işlemi yaptığını göreceksiniz.

    {% 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 %}
    

    Yerleşik görünüm django.contrib.auth.views.logout fonksiyonu bu oturumu kapatma işlemini yönetir.

    Geçerli davranış, kullanıcının oturumu kapattığını bilmesini sağlayan bir kullanıcı arabirimi görüntülemez. İşlem, Django projesinin URL dosyasında tanımlanan 'logout/' yol desenine göre (DjangoWeb/DjangoWeb/urls.py) kullanıcıyı Django web uygulaması "Giriş" sayfasına geri gönderir):

     path('logout/', LogoutView.as_view(next_page='/'), name='logout'),
    

    Daha bilgilendirici bir oturum kapatma onayı görüntülemek için uygulama için bir "Oturumu kapat" sayfası oluşturabilirsiniz.

  3. app/templates/app klasöründe loggedoff.htmladlı yeni bir HTML şablonu dosyası oluşturun.

  4. Yeni şablon dosyasına aşağıdaki içeriği ekleyin:

    {% extends "app/layout.html" %}
    {% block content %}
    <h3>You have been logged off</h3>
    {% endblock %}
    
  5. Django projesinin URL dosyasında DjangoWeb/DjangoWeb/urls.py , 'logout/' yolunun URL desenini aşağıdaki gibi değiştirin:

    path('logout/', LogoutView.as_view(template_name='app/loggedoff.html'), name='logout'),
    

    Güncelleştirilmiş kod, "Oturumu kapatıldı" sayfasının yeni HTML şablonuyla çalışmak için bir template_name özelliği ekler.

  6. Django web uygulamasını durdurun ve yeniden başlatın. Yeniden oturum açın ve ardından oturumu kapat'ıseçin. Bu kez uygulama, kullanıcının oturumunun kapatıldığını onaylamak için kullanıcıya daha bilgilendirici bir ileti gösterir.

    Django web uygulaması için güncellenmiş oturum kapatma davranışını, Oturumu Kapat sayfasındaki bir mesajla gösteren ekran görüntüsü.

  7. Sunucuyu durdurun ve uygulama tarayıcısı pencerelerini kapatın.

Projeyi kaynak denetimine kaydetme

Visual Studio çözümünüzü bu öğretici serisi boyunca kaynak denetimine işliyorsanız, şimdi başka bir işleme yapmak için iyi bir zaman. Bu öğretici serisinde 2. Adım (değişiklikleri kaynak denetimine işleme) yönergeleri izleyin.

Çözümünüz GitHub'da öğretici kaynak koduyla eşleşmelidir: Microsoft/python-sample-vs-learning-django.

Form öğelerinde {% csrf_token %} etiketini kullanma

{% csrf_token %} etiketi, Django'nun yerleşik siteler arası istek sahteciliği (csrf) koruması (Django belgeleri) içerir. Bu etiketi genellikle form gibi POST, PUT veya DELETE istek yöntemlerini içeren herhangi bir öğeye eklersiniz. Şablon işleme işlevi (render) gerekli korumayı ekler.

Öğretici İncelemesi

Bu öğreticiyi Visual Studio'da Django üzerinde tamamladığınız için tebrikler.

Bu öğreticide şunların nasıl yapılacağını öğrendiniz:

  • Visual Studio'da çeşitli şablonları kullanarak farklı türlerde Django projeleri oluşturma
  • Birden çok sayfa içeren bir Django web uygulaması oluşturma
  • Farklı yollar ve sayfa görünümleri oluşturmak için şablonları kullanma
  • Statik dosyalar sunma, sayfa ekleme ve şablon devralmayı kullanma
  • Kısıtlı uygulama sayfalarına ve özelliklerine ve Django yönetim arabirimlerine kimliği doğrulanmış erişim sağlama