Django – Tạo project Django

4.7/5 - (37 votes)

Trong phần này chúng ta sẽ bắt đầu học cách tạo một ứng dụng web bằng django.

Tạo project

C:\Project>django-admin startproject mysite

Để tạo một project Django thì bạn mở Command Prompt (cmd) lên và chuyển đến thư mục mà bạn muốn tạo, sau đó gõ đoạn lệnh phía trên, ở trên chúng ta tạo một project với tên là mysite. Lệnh startproject sẽ tạo một thư mục có tên là mysite, cấu trúc bên trong thư mục sẽ như thế này:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

Chúng ta sẽ từ từ tìm hiểu các file này sau.

Khi đặt tên project bạn tránh đặt những tên trùng với các từ khóa có sẵn trong Python như sys, os, django…. để tránh bị xung đột.

Làm web trong Python Django không giống với các ngôn ngữ khác như PHP, ASP.NET hay Java… bạn phải cài sẵn một web server (như Apache hoặc IIS…) trên máy và cài các phần mềm đi kèm trên web server đó, sau đó bạn viết code và bỏ vào thư mục gốc của web server (vd như www hay htdocs…), mỗi ứng dụng web Django tự chạy một server cho chính nó, do đó bạn có thể đặt code của bạn ở bất kỳ đâu mà bạn muốn.

Chạy server

Thư mục mysite có chức năng tương tự như thư mục gốc trong các web server khác như www hay htdocs… bên trong thư mục này có chứa một file tên là manage.py, file này cung cấp các chức năng để bạn vận hành server của bạn.

C:\Project\mysite>python manage.py runserver

Để chạy server thì bạn chạy file manage.py và đưa vào tham số runserver.

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

March 21, 2016 - 15:50:53
Django version 1.9, using settings 'mysite.settings'
Starting development server at <a class="reference external" href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a>
Quit the server with CTRL-BREAK.

Chúng ta đã chạy một web server viết bằng Python. Mặc định Django server sẽ chạy trên cổng 8000 (chúng ta có thể cấu hình để server chạy trên một cổng khác).

Capture

Bạn có thể vào trình duyệt và trỏ đường dẫn đến 127.0.0.1:8000 hoặc localhost:8000 để xem thông báo của server.

Để đổi port mặc định của server thì bạn thêm số port mà bạn muốn sau tham số runserver.

C:\Project\mysite>python manage.py runserver 8080

Đoạn code trên sẽ chạy server trên port 8080.

Cũng giống như các web server khác, vì Python cũng là một ngôn ngữ thông dịch nên khi bạn viết code xong và bấm save, muốn test thì bạn chỉ cần refresh lại trang web trên trình duyệt là sẽ thấy sự thay đổi, bạn không cần phải khởi động lại server làm gì.

Tạo web app

Những gì chúng ta vừa làm ở trên là tạo một webserver cho project của chúng ta. Bây giờ chúng ta sẽ tạo ứng dụng web trên server này.

C:\Project\mysite>python manage.py startapp polls

Bạn mở một trình Command Prompt khác lên và trỏ đến thư mục chứa file manage.py, sau đó chạy file này với tham số startapp để tạo một ứng dụng web, ở đây chúng ta tạo một ứng dụng web với tên là polls, nếu như bạn chưa biết thì đây là một ứng dụng đặt câu hỏi và cho phép người dùng trả lời trắc nghiệm, thường dùng để làm các chương trình khảo sát người dùng… đây sẽ là ứng dụng mà chúng ta làm trong những bài đầu tiên.

Một thư mục với tên polls sẽ được tạo ra và có cấu trúc như sau:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

Thư mục này chứa các file chuẩn của một ứng dụng web Django.

Sự khác nhau giữa một Project và một Web App là project thì bao gồm nhiều app, trong đó mỗi app thực hiện một công việc riêng biệt.

Tạo View

Trong thư mục polls có chứa một file tên là views.py, bản chất thì file này giống như một file .php, .asp… trong các ngôn ngữ khác vậy.

from django.http import HttpResponse

def index(request):
    response = HttpResponse()
    response.write("<h1>Welcome</h1>")
    response.write("This is the polls app")
    return response

Bên trong file views.py này chúng ta viết hàm index, hàm này trả về một đối tượng HttpResponse. Để gọi được tới hàm index này và lấy nội dung HTML thì chúng ta phải tạo đường dẫn URL tới file này.

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py
Để tạo URL chúng ta tạo một file với tên urls.py bên trong thư mục polls.
from django.conf.urls import url 

from . import views 

 urlpatterns = [ 
     url(r'^$', views.index, name='index'),
]

Bên trong file urls.py chúng ta khai báo một đối tượng List có tên urlpatterns, Django sẽ tìm thông tin về các url trong list này, list này chứa các đối tượng url, mỗi url bao gồm 3 tham số, tham số thứ nhất là biểu thức chính quy (Regex – Regular Expression), tham số thứ hai là tên module và tên hàm sẽ trả về nội dung HTML, ở đây là hàm index trong module views (file views.py), tham số thứ 3 là tên biến toàn cục trong toàn bộ ứng dụng, trong đó 2 tham số đầu tiên là bắt buộc phải có.

Regex (biểu thức chính quy) là một chủ đề khá lớn, Regex cho phép chúng ta tạo ra các mẫu định dạng text dùng trong tìm kiếm, xác thực… ở đây Regex giúp tạo các đường dẫn tới các hàm trả về nội dung HTML một cách tự động. Để tạo các chuỗi Regex thì có một số quy luật sau đây:

  • ^ – bắt đầu regex
  • $ – kết thúc regex
  • \d – một kí tự số
  • + –  kí tự phía trước có thể lặp lại một hoặc nhiều lần
  • / – có một dấu /
  • () – gom nhóm một số kí tự nhất định lại với nhau

Chúng ta sẽ tìm hiểu thêm về Regex sau. Đối với trường hợp của chúng ta thì Regex chỉ đơn giản là ^$, tức là đường dẫn trắng, không có gì cả, khi nhập đường dẫn này thì trả về nội dung từ hàm views.index.

Sau khi đã có đường dẫn cho riêng polls, thì tiếp theo chúng ta phải tạo đường dẫn đến ứng dụng polls này nữa, chúng ta sẽ tạo đường dẫn cho từng ứng dụng trong file mysite/urls.py.

from django.conf.urls import include, url
from django.contrib import admin 

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
]

Bên trong file mysite/urls.py cũng có một list urlpatterns, list này chứa các đối tượng url dẫn đến các ứng dụng web khác mà chúng ta viết.

Ở đây tham số thứ 2 chúng ta không chỉ đến một hàm index nào đó trong một module nào đó, mà chúng ta chỉ đến một module có chứa đối tượng urlpatterns khác, trong trường  hợp này là polls.urls, nên chúng ta phải dùng đến hàm include(), đối với các url chỉ đến một module url khác thì chuỗi regex không kết thúc bằng dấu $, hay nói cách khác là không có kết thúc.

Khi chúng ta gõ localhost:8000 thì django sẽ đọc các url trong file mysite/urls.py, trong file này chúng ta có một đường dẫn đến admin/, đường dẫn này trỏ đến hàm get_url() trong module admin.site của django, do đó bạn có thể gõ localhost:8000/admin và django sẽ trả về một trang đăng nhập mẫu (chúng ta sẽ tìm hiểu về trang admin này sau), url thứ hai là đường dẫn polls/ trỏ đến một file urls.py khác ở module polls.urls do chúng ta tự viết, file này lại chứa một list urlpatterns khác chứa các đường dẫn đến các hàm trả về HTML riêng của chúng, thế nên chúng ta có thể gõ localhost:8000/polls, và django sẽ trả về trang HTML tạo ra từ hàm index() trong module polls.urls.

Capture

Bạn có thể điều chỉnh chuỗi Regex để hiểu thêm.

4.9 10 votes
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

27 Comments
Inline Feedbacks
View all comments
Văn Đức
Văn Đức
7 năm trước

Thank ad nhiều, bài viết rất hay và dễ hiểu :))

Nguyễn Thiệp
Nguyễn Thiệp
7 năm trước

Add ơi, bị lỗi Page not found (404) là bị sao vậy?

hai
hai
6 năm trước

do mysite/urls.py bị đặt sai.
đúng ra phải là : /mysite/mysite/urls.py

misa
misa
6 năm trước

Sory Admin,

mình có làm theo hướng dẫn (đã bổ sung thêm 1 dòng ‘polls’ trong setting.py – mysitse/mysite) nhưng khi chay runserver (project polls) báo lỗi:

Using the URL conf defined in mysite.urls Django tried these URL patterns, in this order :

1. ^polls/
2. ^admin/
the current URL, didn’t match any of these

Admin xem lại giúp nha.

misa
misa
6 năm trước
Reply to  Phở Code

thanks! Adimin nha. mình làm đc rồi.
sory admin, bạn có thể gửi cho mình 1 vài trang web để học python dạng giống phocode ko? mình ko có background IT nên tiếp cận hơi chậm.

Thanks! bạn nhiều lắm…

Phan Nhã
6 năm trước

ad chưa giải thích các câu lệnh hoạt động như thế nào. cách thức hoạt động tuần tự khi ta truy cập. các file như __init__.py , … dùng để làm gì

Tuấn
Tuấn
6 năm trước

Báo lỗi include chưa được định nghĩa thì giải quyết thế nào anh ơi

Hari Yu
Hari Yu
6 năm trước

Bạn cho mình hỏi: Khi tạo project mới thì bị lỗi như thế này

(C:\Anaconda3) C:\Anaconda3\Projects\Django Projects>django-admin startproject mysite
Traceback (most recent call last):
File “C:\Anaconda3\Lib\site-packages\django\django\bin\django-admin.py”, line 2, in
from django.core import management
File “C:\Anaconda\lib\site-packages\django\__init__.py”, line 3, in
from django.utils.version import get_version
File “C:\Anaconda\lib\site-packages\django\django\utils\version.py”, line 61, in
@functools.lru_cache()
AttributeError: ‘module’ object has no attribute ‘lru_cache’

Bạn cho mình hỏi là lỗi gì vậy?

Hari Yu
Hari Yu
6 năm trước
Reply to  Phở Code

Mình dùng python 3 với Anaconda. Cài Django qua pip.

hung
hung
6 năm trước

anh ơi, anh giải thích dòng lệnh này giúp e với được không ạ:
from . import views
Em cám ơn nhiều

Sơn
Sơn
6 năm trước

sao khi mình sử dụng django-admin startproject mysite, thì nó ghi django-admin is not recognised

SInh Lê
SInh Lê
6 năm trước

ad cho em hỏi là học hết phần này thì sẽ tạo ra một ứng dụng ứng dụng đặt câu hỏi và cho phép người dùng trả lời trắc nghiệm, thường dùng để làm các chương trình khảo sát người dùng… phải không ạ

tuấn
tuấn
6 năm trước

Anh cho e hỏi câu lệnh này có ý nghĩa là gì ạ:
from django.conf.urls import url
Em cám ơn anh nhiều

Tích Trần
Tích Trần
2 năm trước

Bài viết rất hay, cám ơn Phở Code

minh
2 năm trước

3 ngày kia mình cài thành công và runserver thành công ,2 hôm nay truy cập lại thì nó báo website reached là sao,cmd runserver nhiều thì nói no such file or folder

hiếu
hiếu
2 năm trước

chỗ này em nhập đúng rồi sao nó báo lỗi k thể import đc vậy ạ
from django.conf.urls import include, url

mê học lập trình
mê học lập trình
1 năm trước

sao mình cứ bị lỗi ôi hỏng không vậy, giúp mình với. 😥😥

Minh Anh
Minh Anh
1 năm trước

ModuleNotFoundError: No module named ‘polls.urls’

Mình gặp lỗi này thì nên fix thế nào ạ

minh
1 năm trước

Mình không truy cập được localhost:8000 thì làm thế nào hả ad?