Các Câu Hỏi Phỏng Vấn Django Quan Trọng Bạn Cần Biết
I. Giới thiệu Django
Django là một framework web mã nguồn mở, miễn phí trên nền tảng Python tuân theo mô hình MVT (model-view-template). Hiện tại, nó được phát triển và duy trì bởi Django Software Foundation (DSF), một tổ chức độc lập ở Hoa kỳ.
Django được tạo vào năm 2003 bởi lập trình viên Adrian Holovaty và Simon Willson. Hai năm sau, nó được phát hành công cộng theo giấy phép BSD. Sau đó đến năm 2008, DSF đảm nhận việc phát triển Django.
Các tổ chức lớn sử dụng Django
PBS
Instagram
Mozilla
The Washington Times
Disqus, Bitbucket
NextDoor
Ưu điểm của Django:
Hệ sinh thái lớn: nó đi kèm với một lượng lớn ứng dụng bên thứ 3 dễ dàng tích hợp với các yêu cầu dự án.
Tuổi đời: django đã được dùng hơn một thập kỷ. Suốt thời gian qua, rất nhiều tính năng được bổ sung và nâng cao để phát triển nó thành một framework mạnh mẽ. Ngoài ra, có rất nhiều tổ chức lớn đang sử dụng Django.
Admin: django hỗ trợ sẵn trang admin cho các thao tác CRUD với các model.
Plugins: cho phép lập trình viện thêm các tính năng mới vào ứng dụng.
Thư viện: vì có cộng đồng lớn nên nó có một lượng lớn thư viện cho mọi tác vụ.
ORM: nó giúp làm việc với dữ liệu theo cách hướng đối tượng.
Django tuân theo mô hình kiến trúc MVT (Model View Template) thay vì mô hình MVC (Model View Controller) truyền thống. Nó khác với MVC ở chỗ, logic vốn của controller được xử lý ở chính view của framework. Còn template nằm ở tầng biểu diễn. HTML được kết hợp với Django Template Language (DTL). Các nhà phát triển cung cấp model, view và template sau đó ánh xạ nó vào URL, để nó phục vụ người dùng.
Một model trong Django là một lớp sẽ được ánh xạ thành một bảng hoặc collection của cơ sở dữ liệu. Mỗi thuộc tính của lớp trong model sẽ là một trường trong cơ sở dữ liệu, nó được định nghĩa trong app/models.py
Ví dụ:
from django.db import models
class SampleModel(models.Model):
field1 = models.CharField(max_length = 50)
field2 = models.IntegerField()
class Meta:
db_table = "sample_model"
Tất cả model đều kết thừa từ django.db.models.Model.
Ở ví dụ trên ta có hai thuộc tính (1 char và 1 integer). Meta giúp bạn thiết lập những thứ có sẵn như quyền truy cập, phiên bản số nhiều và số ít của tên, tên bảng được liên kết, có abstract hay không,…
Template là một phần trong kiến trúc MVT của Django. Nó bao gồm HTML, CSS nơi các biến hay thông tin được nhúng vào từ view. Các biến hay tag sẽ được template engine nhận ra và thông dịch chúng.
Template được render với một ngữ cảnh nhất định, để thay thế các biến thành giá trị của nó và biểu diễn trong ngữ cảnh đó, đồng thời xử lý các tag. Tất cả thứ khác sẽ được giữ nguyên.
Một hàm view hay view, đơn giản là một hàm Python nhận các yêu cầu web và trả về phản hồi. Phản hồi có thể là nội dung HTML của một trang web, một redirect (điều hướng sang trang khác), lỗi 404, hình ảnh hay một XML hoặc JSON,…
Ví dụ:
from django.http import HttpResponsedef sample_function(request): return HttpResponse("Welcome to Django")
ORM (Object Relational Mapper) giúp ta tương tác với cơ sở dữ liệu theo code python thay vì viết các truy vấn sql thuần, nó giúp ta truy xuất, lưu và xoá dễ dàng hơn. Nó hoạt động ở tầng trừu tượng giữa model và cơ sở dữ liệu.
Website cần phục vụ các files như hình ảnh, js và css. Trong Django, các file này gọi là “static file”. Nó được cung cấp bởi django.contrib.staticfiles để quản lý các file đấy.
Django-admin là câu lệnh dùng cho các công việc quản trị trong Django. Bên cạnh đó, manage.py là file tự động tạo khi ta tạo dự án django. Nó không chỉ thực hiện các công việc chung như django-admin mà còn thiết lập môi trường biến DJANGO_SETTINGS_MODULE trỏ đến file settings.py trong dự án.
Các câu lệnh thường dùng trong django.
django-admin startproject: tạo dự án Django với cấu trúc thư mục cho tên dự án nằm trong thư mục hiện tại hoặc đường dẫn.
django-admin startapp: tạo ứng dụng django trong dự án django với tên dự án.
django-admin makemigrations: tạo migration mới sau mỗi lần thay đổi model.
django-admin migrate: thực thi lệnh SQL, đồng bộ cơ sở dữ liệu với model và migrations.
django-admin runserver: chạy web server trên máy localhost. Cổng mặc định là 8000 với địa chỉ IP là 127.0.0.1. Có thể tuỳ chỉnh địa chỉ IP và port.
django-admin createsuperuser: tạo tài khoản với quyền quản trị.
Jinja2 là một ngôn ngữ tạo template cung cấp cho các lập trình viên Python, được tạo ra dựa trên ý tưởng của Django template.
Jinja2 được sử dụng để tạo HTML, XML hoặc các định dạng file khác dựa trên nguyên tắc kết hợp các dữ liệu vào các vị trí đã được đánh dấu trong văn bản.
URL là một phần quan trọng trong ứng dụng web và Django cung cấp cách thiết kế để tuỳ chỉnh URL có tên là URLconf (URL Configuration). Chức năng cơ bản của nó là giúp bạn thiết kế URL ứng với các hàm view. Các URL này có thể là tĩnh hoặc động, được khai báo trong urls.py
Cú pháp:
from django.urls import path
from . import views
urlpatterns = [
path('data/2020/', views.data_2020),
path('data/<int:year>/', views.data_year)
]
12. Sự khác biệt giữa ứng dụng và dự án trong Django?
Trong Django, dự án (project) chỉ toàn bộ ứng dụng (app) và ứng dụng là một phần trong dự án cho xử lý một trường hợp cụ thể. Ví dụ, hệ thống thanh toán (app) trong ứng dụng e-commerce(project).
Bất cứ khi nào chỉnh sửa model, ta cần kích hoạt vài hành động. Django cung cấp một cách để xử lý chúng dưới dạng tín hiệu (signal). Các tín hiệu là những tiện ích cho phép chúng ta liên kết các sự kiện với các hành động. Chúng ta có thể thực hiện những điều này bằng cách phát triển một hàm sẽ chạy khi một tín hiệu gọi nó.
Caching đề cập đến kỹ thuật lưu giữ kết quả output ở lần xử lý đầu tiên cho các lần tiếp theo nếu kết quả trùng lặp. Thay vì xử lý các yêu cầu giống nhau lại lần nữa, ta lấy kết quả cũ đã lưu, giúp truy cập nhanh hơn. Django cung cấp hệ thống cache mạnh mẽ cho lưu trữ ở các trang web động.
Cache
Mô tả
Memcached
Một memory-based cache server nhanh và hiệu quả
FileSystem Caching
Giá trị cache được lưu từng file riêng biệt theo trật tự serialize
Local-memory Caching
Chiến lược cache mặc định của django. Nó xử lý từng tiến trình và thread-safe.
Database caching
Dữ liệu cache được lưu trong cơ sở dữ liệu và hoạt động hiệu quả nếu bạn đánh chỉ mục DB
16. Giải thích về xác thực người dùng trong Django?
Django cung cấp sẵn hệ thống xác thực người dùng, với các đối tượng như users, groups, user-permissions và user sesions. Django không chỉ xác thực (authen) mà còn uỷ quyền (authorize) người dùng.
Các file static được lưu trong thư mục static trong ứng dụng. Như my_sample/static/my_sample/abcxy.jpg.
18. Giải thích về vòng đời Response trong Django?
Bất cứ khi nào một yêu cầu (request) đến web, Django sẽ tạo một đối tượng HttpRequest bao gồm metadata của request. Sau đó Django tải view cụ thể, truyền HttpRequest như tham số đầu tiên cho hàm view. Mỗi view sẽ trả về một đối tượng HttpResponse.
Đầu tiên file settings.py được tải chứa các lớp middleware khác nhau (MIDDLEWARES)
Các middleware được thực thi theo thứ tự mà chúng được thiết lập trong MIDDLEWAREST.
Từ đây, request được chuyển đến URL Router, thứ này chỉ cần lấy đường dẫn URL từ request và cố gắng ánh xạ với các đường dẫn URL tương ứng trong urls.py.
Ngay sau khi nó được ánh xạ, nó sẽ gọi hàm view tương đương, từ đó một response tương đương được tạo ra.
Response cũng đi qua middleware phản hồi và gửi lại cho trình duyệt.
Các cơ sở dữ liệu được Django hỗ trợ sẵn như PostgreSQL, MySQL, SQLite, Oracle bên cạnh đó là ODBC, Microsoft SQL Server, IBM DB2, SAP SQL. Hiện tại Django đã hỗ trợ NoSQL với mongoengine hay django-redis-cache.
Với session framework, ta có thể dễ dàng lưu trữ và truy xuất dữ liệu tuỳ ý dựa trên các lần truy cập trước. Nó lưu trữ dữ liệu phía server và xử lý các quá trình gửi nhận cookie. Do cookie chỉ bao gồm session ID, không có dữ liệu thực trừ khi bạn chỉ định nó.
Middleware là một thứ gì đó nằm giữa request và response. Nói đơn giản hơn nó là một cây cầu. Trong Django, một request được chuyển đến view thông qua middleware và dữ liệu được truyền tới response thông qua middleware.
Context là một tên biến mẫu ánh xạ được cấp cho các đối tượng Python trong Django. Đây là tên chung, nhưng bạn có thể đặt bất kỳ tên nào khác tùy thích nếu bạn muốn.
Khi một hàm view trả về một trang web như HttpResponse thay vì một chuỗi, ta sử dụng render(). Hàm render là một hàm nhỏ giúp lập trình viên dễ dàng truyền dữ liệu vào template. Hàm này kết hợp template với dữ liệu thông qua template engine. Sau cùng, nó trả về một HttpResponse như một văn bản đã render, để trả về dữ liệu bởi model. Do đó, render() bỏ quả hầu hết công việc so với các template engine khác.
Trong đó, request là một tham số dùng cho tạo response. template_name là HTML template dùng. context là dữ liệu được truyền vào trang web. Bạn cũng có thẻ chỉ định content-type, status của dữ liệu và render lại.
Như tên gọi, file này lưu trữ cấu hình hay thiết lập cho ứng dụng Django, như kết nối cơ sở dữ liệu, backend engine, middleware, các ứng dụng bên thứ 3, URL chính, thư mục lưu file static, template engine, key bảo mật, host được phép truy cập,…
Mixin là kiểu đa kế thừa trong đó ta có thể kết hợp các hành vi và thuộc tính từ nhiều hơn một lớp cha. Nó cung cấp cách thông minh giúp sử dụng lại code từ nhiều lớp. Một hạn chế của việc sử dụng các mixin này là khó phân tích xem một lớp đang làm gì và phương thức nào cần ghi đè trong trường hợp code của nó quá rải rác giữa nhiều lớp.
Field (trường) đề cập đến một lớp trừu tượng biểu diễn một cột trong bảng cơ sở dữ liệu. Lớp Field chỉ là một lớp con của RegisterLookupMixin. Trong Django, các trường này được dùng cho tạo bảng cơ sở dữ liệu (db_types()), được dùng để ánh xạ kiểu Python sang cơ sở dữ liệu sử dụng get_prep_value() và ngược lại bằng phương thúc from_db_value(). Do đó, các field là phần cơ bản trong các API khác nhau, chẳng hạn như model và querysets.
31. Sự khác biệt giữa OneToOne Field và ForeignKey Field?
Cả hai đều kà các kiểu phổ biến dùng cho trường trong Django. Sự khác biệt của cả hai là ForeignKey bao gồm lựa chọn on_delete cung với một lớp model vì nó dùng cho mối quan hệ many-to-one trong khi OneToOneField dùng cho mối quan hệ one-to-one và chỉ yêu cầu lớp model.
Nếu không có kết quả trùng, get() sẽ trả về một ngoại lệ DoesNotExist. Nếu nhiều hơn một kết quả, nó sẽ trả về MultipleObjectsReturned.
34. Làm cách nào để lấy truy vấn SQL từ queryset?
print(queryset.query)
35. Cách tuỳ chỉnh chức năng của Django Admin Interface?
Có nhiều cách để tùy chỉnh chức năng của Django Admin Interface. Bạn có thể dựa trên form thêm/thay đổi do Django tạo tự động, bạn có thể thêm module JavaScript bằng cách sử dụng tham số js. Tham số này về cơ bản là danh sách các URL trỏ đến các module JavaScript sẽ được đưa vào dự án của bạn trong thẻ <script>. Bạn cũng có thể viết lượt xem cho quản trị viên nếu bạn muốn.
36. Sự khác biệt giữa select_related và prefetch_related?
Cả hai hàm đều dùng cho lấy các trường liên quan từ model nhưng có vài khác biệt nhỏ. select_related dùng cho mối quan hệ với foreign key tức là dùng join trên chính truy vấn trong khi prefetch_related dùng cho các lookup riêng biệt và join phía python. Ví dụ
select_related
from django.db import models
class Country(models.Model):
country_name = models.CharField(max_length=5)
class State(models.Model):
state_name = models.CharField(max_length=5)
country = model.ForeignKey(Country)
>> states = State.objects.select_related('country').all()
>> for state in states:
… print(state.state_name)
SELECT state_id, state_name, country_name FROM State INNER JOIN Country ON (State.country_id = Country.id)
prefetch_related
>> country = Country.objects.prefetch_related(‘state’).get(id=1)
>> for state in country.state.all():
… print(state.state_name)
SELECT id, country_name FROM country WHERE id=1;SELECT state_id, state_name WHERE State WHERE country_id IN (1);
This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.
Strictly Necessary Cookies
Strictly Necessary Cookie should be enabled at all times so that we can save your preferences for cookie settings.
If you disable this cookie, we will not be able to save your preferences. This means that every time you visit this website you will need to enable or disable cookies again.