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).
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
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
.
Bạn có thể điều chỉnh chuỗi Regex để hiểu thêm.