cari
Rumahpembangunan bahagian belakangTutorial PythonPanduan untuk Membina Apl Blog Lengkap dengan Django menggunakan Metodologi TDD dan PostgreSQL (Pengesahan Pengguna Bahagian Selamat

Selamat kembali, semua! Pada bahagian sebelumnya, kami mewujudkan proses pendaftaran pengguna yang selamat untuk aplikasi blog Django kami. Namun, selepas pendaftaran berjaya, kami dialihkan ke laman utama. Tingkah laku ini akan diubah suai sebaik sahaja kami melaksanakan pengesahan pengguna. Pengesahan pengguna memastikan bahawa hanya pengguna yang diberi kuasa boleh mengakses fungsi tertentu dan melindungi maklumat sensitif.
Guide to Building a Complete Blog App with Django using TDD Methodology and PostgreSQL (Part  Secure User Authentication
Dalam siri ini, kami sedang membina aplikasi blog yang lengkap, berpandukan Rajah Perhubungan Entiti (ERD) berikut. Untuk kali ini, tumpuan kami adalah pada menyediakan proses pengesahan pengguna yang selamat. Jika anda mendapati kandungan ini membantu, sila like, komen dan langgan untuk kekal dikemas kini apabila bahagian seterusnya dikeluarkan.
Guide to Building a Complete Blog App with Django using TDD Methodology and PostgreSQL (Part  Secure User Authentication
Ini ialah pratonton cara halaman log masuk kami akan kelihatan selepas kami melaksanakan fungsi log masuk. Jika anda belum membaca bahagian sebelumnya dalam siri ini, saya syorkan berbuat demikian, kerana tutorial ini adalah kesinambungan daripada langkah sebelumnya.

Baiklah, mari kita mulakan !!

Django dilengkapi dengan apl terbina dalam yang dipanggil contrib.auth, yang memudahkan pengendalian pengesahan pengguna untuk kami. Anda boleh menyemak fail blog_env/settings.py, di bawah INSTALLED_APPS, anda akan melihat bahawa pengesahan sudah disenaraikan.

# django_project/settings.py
INSTALLED_APPS = [
    # "django.contrib.admin",
    "django.contrib.auth",  # 



<p>Apl pengesahan memberikan kami berbilang paparan pengesahan untuk mengendalikan log masuk, log keluar, penukaran kata laluan, tetapan semula kata laluan, dll. Ini bermakna fungsi pengesahan penting, seperti log masuk pengguna, pendaftaran dan kebenaran, sedia untuk digunakan tanpa perlu untuk membina segala-galanya dari awal.</p>

<p>Dalam tutorial ini, kami akan menumpukan semata-mata pada paparan log masuk dan log keluar, dan meliputi paparan yang lain dalam bahagian siri yang kemudian.</p>

<h2>
  
  
  1. Buat borang log masuk
</h2>

<p>Mengikut pendekatan TDD kami, mari mulakan dengan membuat ujian untuk borang log masuk. Memandangkan kami belum membuat borang log masuk lagi, navigasi ke fail pengguna/forms.py dan buat kelas baharu yang diwarisi daripada AuthenticationForm.<br>
</p>

<pre class="brush:php;toolbar:false"># users/forms.py
from django.contrib.auth import AuthenticationForm

class LoginForm(AuthenticationForm):


Setelah borang ditakrifkan, kami boleh menambah kes ujian dalam pengguna/tests/test_forms.py untuk mengesahkan kefungsiannya.

# users/tests/test_forms.py

#   --- other code

class LoginFormTest(TestCase):
  def setUp(self):
    self.user = User.objects.create_user(
      full_name= 'Tester User',
      email= 'tester@gmail.com',
      bio= 'new bio for tester',
      password= 'password12345'
    )

  def test_valid_credentials(self):
    """
    With valid credentials, the form should be valid
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': 'password12345',
      'remember_me': False
    }

    form = LoginForm(data = credentials)
    self.assertTrue(form.is_valid())

  def test_wrong_credentials(self):
    """
    With wrong credentials, the form should raise Invalid email or password error
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': 'wrongpassword',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertIn('Invalid email or password', str(form.errors['__all__']))

  def test_credentials_with_empty_email(self):
    """
    Should raise an error when the email field is empty
    """
    credentials = {
      'email': '',
      'password': 'password12345',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertFalse(form.is_valid())
    self.assertIn('This field is required', str(form.errors['email']))

  def test_credentials_with_empty_password(self):
    """
    Should raise error when the password field is empty
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': '',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertFalse(form.is_valid())
    self.assertIn('This field is required', str(form.errors['password']))

Ujian ini meliputi senario seperti log masuk yang berjaya dengan bukti kelayakan yang sah, log masuk gagal dengan bukti kelayakan yang tidak sah dan pengendalian mesej ralat dengan sewajarnya.

Kelas AuthenticationForm menyediakan beberapa pengesahan asas secara lalai. Walau bagaimanapun, dengan Log Masuk kami, kami boleh menyesuaikan tingkah lakunya dan menambah sebarang peraturan pengesahan yang diperlukan untuk memenuhi keperluan khusus kami.

# django_project/settings.py
INSTALLED_APPS = [
    # "django.contrib.admin",
    "django.contrib.auth",  # 



<p>Kami telah mencipta borang log masuk tersuai yang merangkumi medan berikut: <strong>e-mel</strong>, <strong>kata laluan</strong> dan <strong>ingat_saya</strong>. Kotak pilihan remember_me membolehkan pengguna mengekalkan sesi log masuk mereka merentas sesi penyemak imbas.</p>

<p>Memandangkan borang kami memanjangkan Borang Pengesahan, kami telah mengatasi beberapa gelagat lalai:</p>

  • ** Kaedah __init__**: Kami telah mengalih keluar medan nama pengguna lalai daripada borang untuk diselaraskan dengan pengesahan berasaskan e-mel kami.
  • kaedah bersih(): Kaedah ini mengesahkan medan e-mel dan kata laluan. Jika bukti kelayakan adalah sah, kami mengesahkan pengguna menggunakan mekanisme pengesahan terbina dalam Django.
  • Kaedah confirm_login_allowed(): Kaedah terbina dalam ini memberi peluang untuk pengesahan tambahan sebelum log masuk. Anda boleh mengatasi kaedah ini untuk melaksanakan semakan tersuai jika perlu. Sekarang ujian kami harus lulus:
# users/forms.py
from django.contrib.auth import AuthenticationForm

class LoginForm(AuthenticationForm):


2. Cipta paparan log masuk kami

2.1 Buat ujian untuk paparan log masuk

Memandangkan kita belum mempunyai paparan untuk log masuk, mari kita navigasi ke fail users/views.py dan buat kelas baharu yang diwarisi daripada Log Masuk apl auth

# users/tests/test_forms.py

#   --- other code

class LoginFormTest(TestCase):
  def setUp(self):
    self.user = User.objects.create_user(
      full_name= 'Tester User',
      email= 'tester@gmail.com',
      bio= 'new bio for tester',
      password= 'password12345'
    )

  def test_valid_credentials(self):
    """
    With valid credentials, the form should be valid
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': 'password12345',
      'remember_me': False
    }

    form = LoginForm(data = credentials)
    self.assertTrue(form.is_valid())

  def test_wrong_credentials(self):
    """
    With wrong credentials, the form should raise Invalid email or password error
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': 'wrongpassword',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertIn('Invalid email or password', str(form.errors['__all__']))

  def test_credentials_with_empty_email(self):
    """
    Should raise an error when the email field is empty
    """
    credentials = {
      'email': '',
      'password': 'password12345',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertFalse(form.is_valid())
    self.assertIn('This field is required', str(form.errors['email']))

  def test_credentials_with_empty_password(self):
    """
    Should raise error when the password field is empty
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': '',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertFalse(form.is_valid())
    self.assertIn('This field is required', str(form.errors['password']))

Di bahagian bawah fail pengguna/tests/test_views.py tambahkan kes ujian ini

# users/forms.py

# -- other code
from django.contrib.auth.forms import UserCreationForm, UserChangeForm, AuthenticationForm # new line
from django.contrib.auth import get_user_model, authenticate # new line


# --- other code

class LoginForm(AuthenticationForm):
  email = forms.EmailField(
    required=True,
    widget=forms.EmailInput(attrs={'placeholder': 'Email','class': 'form-control',})
  )
  password = forms.CharField(
    required=True,
    widget=forms.PasswordInput(attrs={
                                'placeholder': 'Password',
                                'class': 'form-control',
                                'data-toggle': 'password',
                                'id': 'password',
                                'name': 'password',
                                })
  )
  remember_me = forms.BooleanField(required=False)

  def __init__(self, *args, **kwargs):
    super(LoginForm, self).__init__(*args, **kwargs)
    # Remove username field

    if 'username' in self.fields:
      del self.fields['username']

  def clean(self):
    email = self.cleaned_data.get('email')
    password = self.cleaned_data.get('password')

    # Authenticate using email and password
    if email and password:
      self.user_cache = authenticate(self.request, email=email, password=password)
      if self.user_cache is None:
        raise forms.ValidationError("Invalid email or password")
      else:
        self.confirm_login_allowed(self.user_cache)
    return self.cleaned_data

  class Meta:
    model = User
    fields = ('email', 'password', 'remember_me')

Kita perlu memastikan bahawa ujian ini gagal pada peringkat ini.

2.2 Buat paparan log masuk

Dalam fail users/views.py di bahagian bawah fail tambahkan kod di bawah:

(.venv)$ python3 manage.py test users.tests.test_forms
Found 9 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.........
----------------------------------------------------------------------
Ran 9 tests in 3.334s
OK
Destroying test database for alias 'default'...

Dalam kod di atas, kami mencapai perkara berikut:

  • Tetapkan Atribut form_class: Kami menentukan Borang Masuk tersuai kami sebagai atribut form_class kerana kami tidak lagi menggunakan Borang Pengesahan lalai.
  • Timpa Kaedah form_valid: Kami mengatasi kaedah form_valid, yang dipanggil apabila data borang yang sah telah disiarkan. Ini membolehkan kami melaksanakan gelagat tersuai selepas pengguna berjaya melog masuk.
  • Kendalikan Tamat Tempoh Sesi: Jika pengguna tidak menandai kotak remember_me, sesi akan tamat tempoh secara automatik apabila penyemak imbas ditutup. Walau bagaimanapun, jika kotak remember_me ditandakan, sesi akan berlangsung untuk tempoh yang ditentukan dalam settings.py. Tempoh sesi lalai ialah dua minggu, tetapi kami boleh mengubah suai ini menggunakan pembolehubah SESSION_COOKIE_AGE dalam settings.py. Contohnya, untuk menetapkan umur kuki kepada 7 hari, kami boleh menambah baris berikut pada tetapan kami:
# -- other code 
from .forms import CustomUserCreationForm, LoginForm
from django.contrib.auth import get_user_model, views
# -- other code

class CustomLoginView(views.LoginForm):


Untuk menyambungkan fungsi log masuk tersuai anda dan membenarkan pengguna mengakses halaman log masuk, kami akan mentakrifkan corak URL dalam fail pengguna/urls.py. Fail ini akan memetakan URL tertentu (/log_in/ dalam kes ini) kepada paparan yang sepadan (CustomLoginView). Selain itu, kami akan memasukkan laluan untuk kefungsian log keluar menggunakan LogoutView terbina dalam Django.

# django_project/settings.py
INSTALLED_APPS = [
    # "django.contrib.admin",
    "django.contrib.auth",  # 



<p>Semuanya kelihatan teratur, tetapi kami harus menentukan tempat untuk mengubah hala pengguna apabila berjaya log masuk dan log keluar. Untuk melakukan ini, kami akan menggunakan tetapan LOGIN_REDIRECT_URL dan LOGOUT_REDIRECT_URL. Di bahagian bawah fail blog_app/settings.py anda, tambahkan baris berikut untuk mengubah hala pengguna ke halaman utama:<br>
</p>

<pre class="brush:php;toolbar:false"># users/forms.py
from django.contrib.auth import AuthenticationForm

class LoginForm(AuthenticationForm):


Sekarang kami mempunyai URL log masuk, mari kemas kini SignUpView kami dalam fail users/views.py untuk mengubah hala ke halaman log masuk apabila pendaftaran berjaya.

# users/tests/test_forms.py

#   --- other code

class LoginFormTest(TestCase):
  def setUp(self):
    self.user = User.objects.create_user(
      full_name= 'Tester User',
      email= 'tester@gmail.com',
      bio= 'new bio for tester',
      password= 'password12345'
    )

  def test_valid_credentials(self):
    """
    With valid credentials, the form should be valid
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': 'password12345',
      'remember_me': False
    }

    form = LoginForm(data = credentials)
    self.assertTrue(form.is_valid())

  def test_wrong_credentials(self):
    """
    With wrong credentials, the form should raise Invalid email or password error
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': 'wrongpassword',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertIn('Invalid email or password', str(form.errors['__all__']))

  def test_credentials_with_empty_email(self):
    """
    Should raise an error when the email field is empty
    """
    credentials = {
      'email': '',
      'password': 'password12345',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertFalse(form.is_valid())
    self.assertIn('This field is required', str(form.errors['email']))

  def test_credentials_with_empty_password(self):
    """
    Should raise error when the password field is empty
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': '',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertFalse(form.is_valid())
    self.assertIn('This field is required', str(form.errors['password']))

Kami juga akan mengemas kini SignUpTexts kami, khususnya test_signup_correct_data(self), untuk mencerminkan tingkah laku baharu dan memastikan perubahan kami diuji dengan betul.

# users/forms.py

# -- other code
from django.contrib.auth.forms import UserCreationForm, UserChangeForm, AuthenticationForm # new line
from django.contrib.auth import get_user_model, authenticate # new line


# --- other code

class LoginForm(AuthenticationForm):
  email = forms.EmailField(
    required=True,
    widget=forms.EmailInput(attrs={'placeholder': 'Email','class': 'form-control',})
  )
  password = forms.CharField(
    required=True,
    widget=forms.PasswordInput(attrs={
                                'placeholder': 'Password',
                                'class': 'form-control',
                                'data-toggle': 'password',
                                'id': 'password',
                                'name': 'password',
                                })
  )
  remember_me = forms.BooleanField(required=False)

  def __init__(self, *args, **kwargs):
    super(LoginForm, self).__init__(*args, **kwargs)
    # Remove username field

    if 'username' in self.fields:
      del self.fields['username']

  def clean(self):
    email = self.cleaned_data.get('email')
    password = self.cleaned_data.get('password')

    # Authenticate using email and password
    if email and password:
      self.user_cache = authenticate(self.request, email=email, password=password)
      if self.user_cache is None:
        raise forms.ValidationError("Invalid email or password")
      else:
        self.confirm_login_allowed(self.user_cache)
    return self.cleaned_data

  class Meta:
    model = User
    fields = ('email', 'password', 'remember_me')

2.3 Cipta templat untuk Log Masuk

Kemudian buat fail pengguna/template/pendaftaran/login.html dengan editor teks anda dan sertakan kod berikut:

(.venv)$ python3 manage.py test users.tests.test_forms
Found 9 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.........
----------------------------------------------------------------------
Ran 9 tests in 3.334s
OK
Destroying test database for alias 'default'...

Kami akan menambah fungsi Lupa Kata Laluan kemudian dalam siri ini tetapi kini ia hanyalah pautan mati.
Guide to Building a Complete Blog App with Django using TDD Methodology and PostgreSQL (Part  Secure User Authentication
Sekarang, mari kami mengemas kini templat layout.html kami untuk memasukkan pautan log masuk, pendaftaran dan log keluar.

# -- other code 
from .forms import CustomUserCreationForm, LoginForm
from django.contrib.auth import get_user_model, views
# -- other code

class CustomLoginView(views.LoginForm):


Dalam templat kami, kami menyemak sama ada pengguna itu disahkan. Jika pengguna log masuk, kami memaparkan pautan log keluar dan nama penuh pengguna. Jika tidak, kami menunjukkan pautan log masuk dan pendaftaran.
Sekarang mari jalankan semua ujian

# users/tests/test_views.py

# -- other code

class LoginTests(TestCase):
  def setUp(self):
    User.objects.create_user(
      full_name= 'Tester User',
      email= 'tester@gmail.com',
      bio= 'new bio for tester',
      password= 'password12345'
    )
    self.valid_credentials = {
      'email': 'tester@gmail.com',
      'password': 'password12345',
      'remember_me': False
    }

  def test_login_url(self):
    """User can navigate to the login page"""
    response = self.client.get(reverse('users:login'))
    self.assertEqual(response.status_code, 200)

  def test_login_template(self):
    """Login page render the correct template"""
    response = self.client.get(reverse('users:login'))
    self.assertTemplateUsed(response, template_name='registration/login.html')
    self.assertContains(response, '<a class="btn btn-outline-dark text-white" href="/users/sign_up/">Sign Up</a>')

  def test_login_with_valid_credentials(self):
    """User should be log in when enter valid credentials"""
    response = self.client.post(reverse('users:login'), self.valid_credentials, follow=True)
    self.assertEqual(response.status_code, 200)
    self.assertRedirects(response, reverse('home'))
    self.assertTrue(response.context['user'].is_authenticated)
    self.assertContains(response, '<button type="submit" class="btn btn-danger"><i class="bi bi-door-open-fill"></i> Log out</button>')

  def test_login_with_wrong_credentials(self):
    """Get error message when enter wrong credentials"""
    credentials = {
      'email': 'tester@gmail.com',
      'password': 'wrongpassword',
      'remember_me': False
    }

    response = self.client.post(reverse('users:login'), credentials, follow=True)
    self.assertEqual(response.status_code, 200)
    self.assertContains(response, 'Invalid email or password')
    self.assertFalse(response.context['user'].is_authenticated)

3. Uji sama ada semuanya berfungsi sebagaimana mestinya dalam penyemak imbas kami

Sekarang kami telah mengkonfigurasikan fungsi log masuk dan log keluar, tiba masanya untuk menguji segala-galanya dalam penyemak imbas web kami. Mari mulakan pelayan pembangunan

# django_project/settings.py
INSTALLED_APPS = [
    # "django.contrib.admin",
    "django.contrib.auth",  # 



<p>Navigasi ke halaman pendaftaran dan masukkan kelayakan yang sah. Selepas pendaftaran berjaya, anda harus dialihkan ke halaman log masuk. Masukkan maklumat pengguna dalam borang log masuk, dan setelah log masuk, klik butang log keluar. Anda kemudiannya harus log keluar dan diubah hala ke halaman utama. Akhir sekali, sahkan bahawa anda tidak log masuk lagi dan pautan pendaftaran dan log masuk dipaparkan sekali lagi.<br>
Semuanya berfungsi dengan sempurna, tetapi saya perhatikan bahawa apabila pengguna log masuk dan melawat halaman pendaftaran di http://127.0.0.1:8000/users/sign_up/, mereka masih mempunyai akses kepada borang pendaftaran. Sebaik-baiknya, sebaik sahaja pengguna log masuk, mereka sepatutnya tidak boleh mengakses halaman pendaftaran.<br>
<img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/172924669044575.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Guide to Building a Complete Blog App with Django using TDD Methodology and PostgreSQL (Part  Secure User Authentication"><br>
Tingkah laku ini boleh memperkenalkan beberapa kelemahan keselamatan ke dalam projek kami. Untuk menangani perkara ini, kami perlu mengemas kini SignUpView untuk mengubah hala mana-mana pengguna log masuk ke halaman utama.<br>
Tetapi pertama-tama, mari kemas kini LoginTest kami untuk menambah ujian baharu yang merangkumi senario. Jadi dalam pengguna/tests/test_views.py tambahkan kod ini.<br>
</p>

<pre class="brush:php;toolbar:false"># users/forms.py
from django.contrib.auth import AuthenticationForm

class LoginForm(AuthenticationForm):


Kini, kami boleh mengemas kini SignUpView kami

# users/tests/test_forms.py

#   --- other code

class LoginFormTest(TestCase):
  def setUp(self):
    self.user = User.objects.create_user(
      full_name= 'Tester User',
      email= 'tester@gmail.com',
      bio= 'new bio for tester',
      password= 'password12345'
    )

  def test_valid_credentials(self):
    """
    With valid credentials, the form should be valid
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': 'password12345',
      'remember_me': False
    }

    form = LoginForm(data = credentials)
    self.assertTrue(form.is_valid())

  def test_wrong_credentials(self):
    """
    With wrong credentials, the form should raise Invalid email or password error
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': 'wrongpassword',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertIn('Invalid email or password', str(form.errors['__all__']))

  def test_credentials_with_empty_email(self):
    """
    Should raise an error when the email field is empty
    """
    credentials = {
      'email': '',
      'password': 'password12345',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertFalse(form.is_valid())
    self.assertIn('This field is required', str(form.errors['email']))

  def test_credentials_with_empty_password(self):
    """
    Should raise error when the password field is empty
    """
    credentials = {
      'email': 'tester@gmail.com',
      'password': '',
      'remember_me': False
    }
    form = LoginForm(data = credentials)
    self.assertFalse(form.is_valid())
    self.assertIn('This field is required', str(form.errors['password']))

Dalam kod di atas, kami mengatasi kaedah dispatch() SignUpView kami untuk mengubah hala mana-mana pengguna yang telah log masuk dan cuba mengakses halaman pendaftaran. Ubah hala ini akan menggunakan set LOGIN_REDIRECT_URL dalam fail settings.py kami, yang dalam kes ini, menghala ke halaman utama.
Okey! Sekali lagi, mari jalankan semua ujian kami untuk mengesahkan bahawa kemas kini kami berfungsi seperti yang diharapkan

# users/forms.py

# -- other code
from django.contrib.auth.forms import UserCreationForm, UserChangeForm, AuthenticationForm # new line
from django.contrib.auth import get_user_model, authenticate # new line


# --- other code

class LoginForm(AuthenticationForm):
  email = forms.EmailField(
    required=True,
    widget=forms.EmailInput(attrs={'placeholder': 'Email','class': 'form-control',})
  )
  password = forms.CharField(
    required=True,
    widget=forms.PasswordInput(attrs={
                                'placeholder': 'Password',
                                'class': 'form-control',
                                'data-toggle': 'password',
                                'id': 'password',
                                'name': 'password',
                                })
  )
  remember_me = forms.BooleanField(required=False)

  def __init__(self, *args, **kwargs):
    super(LoginForm, self).__init__(*args, **kwargs)
    # Remove username field

    if 'username' in self.fields:
      del self.fields['username']

  def clean(self):
    email = self.cleaned_data.get('email')
    password = self.cleaned_data.get('password')

    # Authenticate using email and password
    if email and password:
      self.user_cache = authenticate(self.request, email=email, password=password)
      if self.user_cache is None:
        raise forms.ValidationError("Invalid email or password")
      else:
        self.confirm_login_allowed(self.user_cache)
    return self.cleaned_data

  class Meta:
    model = User
    fields = ('email', 'password', 'remember_me')

Saya tahu banyak lagi yang perlu dicapai, tetapi mari kita luangkan sedikit masa untuk menghargai apa yang telah kita capai setakat ini. Bersama-sama, kami telah menyediakan persekitaran projek kami, menyambungkan pangkalan data PostgreSQL dan melaksanakan sistem pendaftaran dan log masuk pengguna yang selamat untuk aplikasi blog Django kami. Dalam bahagian seterusnya, kami akan menyelami membuat halaman profil pengguna, membolehkan pengguna mengedit maklumat mereka dan menetapkan semula kata laluan! Nantikan perkembangan yang lebih menarik sambil kami meneruskan perjalanan aplikasi blog Django kami!

Maklum balas anda sentiasa dihargai. Sila kongsi pendapat, soalan atau cadangan anda dalam ulasan di bawah. Jangan lupa like, tinggalkan komen dan langgan untuk mengikuti perkembangan terkini!

Atas ialah kandungan terperinci Panduan untuk Membina Apl Blog Lengkap dengan Django menggunakan Metodologi TDD dan PostgreSQL (Pengesahan Pengguna Bahagian Selamat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Python vs C: Lengkung pembelajaran dan kemudahan penggunaanPython vs C: Lengkung pembelajaran dan kemudahan penggunaanApr 19, 2025 am 12:20 AM

Python lebih mudah dipelajari dan digunakan, manakala C lebih kuat tetapi kompleks. 1. Sintaks Python adalah ringkas dan sesuai untuk pemula. Penaipan dinamik dan pengurusan memori automatik menjadikannya mudah digunakan, tetapi boleh menyebabkan kesilapan runtime. 2.C menyediakan kawalan peringkat rendah dan ciri-ciri canggih, sesuai untuk aplikasi berprestasi tinggi, tetapi mempunyai ambang pembelajaran yang tinggi dan memerlukan memori manual dan pengurusan keselamatan jenis.

Python vs C: Pengurusan dan Kawalan MemoriPython vs C: Pengurusan dan Kawalan MemoriApr 19, 2025 am 12:17 AM

Python dan C mempunyai perbezaan yang signifikan dalam pengurusan dan kawalan memori. 1. Python menggunakan pengurusan memori automatik, berdasarkan pengiraan rujukan dan pengumpulan sampah, memudahkan kerja pengaturcara. 2.C memerlukan pengurusan memori manual, memberikan lebih banyak kawalan tetapi meningkatkan risiko kerumitan dan kesilapan. Bahasa mana yang harus dipilih harus berdasarkan keperluan projek dan timbunan teknologi pasukan.

Python untuk pengkomputeran saintifik: rupa terperinciPython untuk pengkomputeran saintifik: rupa terperinciApr 19, 2025 am 12:15 AM

Aplikasi Python dalam pengkomputeran saintifik termasuk analisis data, pembelajaran mesin, simulasi berangka dan visualisasi. 1.Numpy menyediakan susunan pelbagai dimensi yang cekap dan fungsi matematik. 2. Scipy memanjangkan fungsi numpy dan menyediakan pengoptimuman dan alat algebra linear. 3. Pandas digunakan untuk pemprosesan dan analisis data. 4.Matplotlib digunakan untuk menghasilkan pelbagai graf dan hasil visual.

Python dan C: Mencari alat yang betulPython dan C: Mencari alat yang betulApr 19, 2025 am 12:04 AM

Sama ada untuk memilih Python atau C bergantung kepada keperluan projek: 1) Python sesuai untuk pembangunan pesat, sains data, dan skrip kerana sintaks ringkas dan perpustakaan yang kaya; 2) C sesuai untuk senario yang memerlukan prestasi tinggi dan kawalan asas, seperti pengaturcaraan sistem dan pembangunan permainan, kerana kompilasi dan pengurusan memori manualnya.

Python untuk sains data dan pembelajaran mesinPython untuk sains data dan pembelajaran mesinApr 19, 2025 am 12:02 AM

Python digunakan secara meluas dalam sains data dan pembelajaran mesin, terutamanya bergantung pada kesederhanaannya dan ekosistem perpustakaan yang kuat. 1) PANDAS digunakan untuk pemprosesan dan analisis data, 2) Numpy menyediakan pengiraan berangka yang cekap, dan 3) SCIKIT-Learn digunakan untuk pembinaan dan pengoptimuman model pembelajaran mesin, perpustakaan ini menjadikan Python alat yang ideal untuk sains data dan pembelajaran mesin.

Pembelajaran Python: Adakah 2 jam kajian harian mencukupi?Pembelajaran Python: Adakah 2 jam kajian harian mencukupi?Apr 18, 2025 am 12:22 AM

Adakah cukup untuk belajar Python selama dua jam sehari? Ia bergantung pada matlamat dan kaedah pembelajaran anda. 1) Membangunkan pelan pembelajaran yang jelas, 2) Pilih sumber dan kaedah pembelajaran yang sesuai, 3) mengamalkan dan mengkaji semula dan menyatukan amalan tangan dan mengkaji semula dan menyatukan, dan anda secara beransur-ansur boleh menguasai pengetahuan asas dan fungsi lanjutan Python dalam tempoh ini.

Python untuk Pembangunan Web: Aplikasi UtamaPython untuk Pembangunan Web: Aplikasi UtamaApr 18, 2025 am 12:20 AM

Aplikasi utama Python dalam pembangunan web termasuk penggunaan kerangka Django dan Flask, pembangunan API, analisis data dan visualisasi, pembelajaran mesin dan AI, dan pengoptimuman prestasi. 1. Rangka Kerja Django dan Flask: Django sesuai untuk perkembangan pesat aplikasi kompleks, dan Flask sesuai untuk projek kecil atau sangat disesuaikan. 2. Pembangunan API: Gunakan Flask atau DjangorestFramework untuk membina Restfulapi. 3. Analisis Data dan Visualisasi: Gunakan Python untuk memproses data dan memaparkannya melalui antara muka web. 4. Pembelajaran Mesin dan AI: Python digunakan untuk membina aplikasi web pintar. 5. Pengoptimuman Prestasi: Dioptimumkan melalui pengaturcaraan, caching dan kod tak segerak

Python vs C: Meneroka Prestasi dan KecekapanPython vs C: Meneroka Prestasi dan KecekapanApr 18, 2025 am 12:20 AM

Python lebih baik daripada C dalam kecekapan pembangunan, tetapi C lebih tinggi dalam prestasi pelaksanaan. 1. Sintaks ringkas Python dan perpustakaan yang kaya meningkatkan kecekapan pembangunan. 2. Ciri-ciri jenis kompilasi dan kawalan perkakasan meningkatkan prestasi pelaksanaan. Apabila membuat pilihan, anda perlu menimbang kelajuan pembangunan dan kecekapan pelaksanaan berdasarkan keperluan projek.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa