+1

Biểu thức chính quy trong Django: Chinh phục URL và xác thực dữ liệu

Biểu thức chính quy (regex) – nghe có vẻ phức tạp nhưng lại là công cụ đắc lực trong Django, giúp bạn tạo URL tùy chỉnh và xác thực dữ liệu người dùng một cách linh hoạt. Hãy cùng tìm hiểu cách regex đơn giản hóa việc phát triển web với Django.

Biểu thức chính quy là gì?

Biểu thức chính quy là các mẫu được sử dụng để khớp với văn bản. Trong Django, chúng cực kỳ hữu ích cho:

  • Định tuyến URL tùy chỉnh (ví dụ: khớp định dạng cụ thể như năm hoặc tên người dùng trong URL).
  • Xác thực biểu mẫu (ví dụ: đảm bảo số điện thoại hoặc tên người dùng đáp ứng các tiêu chí cụ thể).

Ví dụ, biểu thức chính quy này:

^[a-zA-Z]+$  

... phù hợp với các chuỗi chỉ chứa chữ cái.

Tức là:

  • ^ có nghĩa là "bắt đầu chuỗi".
  • [a-zA-Z] có nghĩa là "bất kỳ chữ cái nào (viết hoa hoặc viết thường)."
  • + có nghĩa là "một hoặc nhiều".
  • $ có nghĩa là "kết thúc chuỗi".

Bây giờ, chúng ta hãy xem Django sử dụng phép thuật này như thế nào.

Thiết lập dự án Django của bạn

  1. Tạo ứng dụng Django nếu bạn chưa có:
   django-admin startproject regex_demo
   cd regex_demo
   python manage.py startapp regex_app
  1. Thêm regex_appvào INSTALLED_APPStrong settings.py

Ví dụ 1: Định tuyến URL tùy chỉnh

Hãy tạo một mẫu URL khớp với năm gồm bốn chữ số như /articles/2024/

urls.py: Xác định mẫu

from django.urls import re_path
from . import views

urlpatterns = [
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.articles_by_year, name='articles_by_year'),
]

Sau đây là những gì đang xảy ra:

  • r'^articles/(?P<year>[0-9]{4})/$': Các kết quả /articles/ khớp với số có bốn chữ số theo sau (ví dụ: 2024).
  • (?P<year>[0-9]{4}): Ghi lại năm vào một biến có tên là year.

views.py: Xử lý yêu cầu

from django.http import HttpResponse

def articles_by_year(request, year):
    return HttpResponse(f"Articles from the year {year}")

Truy cập /articles/2024/ vào trình duyệt của bạn và bạn sẽ thấy:

Articles from the year 2024

Ví dụ 2: Xác thực đầu vào biểu mẫu

Giả sử chúng ta muốn đảm bảo tên người dùng chỉ chứa chữ cái, số và dấu gạch dưới.

forms.py: Thêm Logic xác thực

from django import forms
import re

class UsernameForm(forms.Form):
    username = forms.CharField(max_length=30)

    def clean_username(self):
        username = self.cleaned_data['username']
        if not re.match(r'^[a-zA-Z0-9_]+$', username):
            raise forms.ValidationError("Username can only contain letters, numbers, and underscores.")
        return username

views.py: Hiển thị biểu mẫu

from django.shortcuts import render
from .forms import UsernameForm

def signup(request):
    if request.method == 'POST':
        form = UsernameForm(request.POST)
        if form.is_valid():
            return HttpResponse("Signup successful!")
    else:
        form = UsernameForm()
    return render(request, 'signup.html', {'form': form})

signup.html: Biểu mẫu HTML đơn giản

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Sign Up</button>
</form>

Hãy thử nghiệm:

  • Nhập vào valid_user123 — nó hoạt động!
  • Nhập — invalid$user! bạn sẽ thấy thông báo lỗi.

Lời khuyên cuối cùng

  • Sử dụng công cụ trực tuyến: Kiểm tra mẫu biểu thức chính quy của bạn trên các trang web như regex101.com .
  • Viết biểu thức chính quy có thể đọc được: Sử dụng re.VERBOSEđể thêm chú thích để rõ ràng hơn:
   pattern = re.compile(r"""
       ^            # Start of string
       [a-zA-Z0-9_] # Letters, numbers, or underscores
       +            # One or more
       $            # End of string
   """, re.VERBOSE)

Tại sao nên học Regex trong Django?

Regex cung cấp cho bạn các mẫu URL chính xác, xác thực đầu vào chống đạn và khả năng xử lý văn bản mạnh mẽ. Đây là công cụ bắt buộc phải có đối với bất kỳ nhà phát triển Django nào. Hãy thử nghiệm và sớm thôi, regex sẽ trở thành bản chất thứ hai.

Hy vọng thông tin trong bài viết sẽ giúp ích nhiều cho các bạn trong quá trình học tập và làm việc.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.