Django – Host website với PythonAnywhere

4.8/5 - (12 votes)

Từ trước tới nay chúng ta chỉ làm việc trên máy local, tức là máy của chính chúng ta. Trong bài này chúng ta sẽ tìm cách triển khai website đó lên mạng để cả thế giới có thể truy cập được 🙂

Trên mạng có rất nhiều nhà cung cấp dịch vụ host, ở đây chúng ta sẽ sử dụng nhà cung cấp PythonAnywhere vì PythonAnywhere miễn phí dịch vụ cho các website nhỏ lẻ, ít có khách truy cập, thích hợp cho việc test host.

Ngoài ra chúng ta sẽ sử dụng một dịch vụ khác nữa là GitHub, đây là dịch vụ lưu trữ code. Ngoài GitHub còn có rất nhiều dịch vụ lưu trữ code khác, tuy nhiên GitHub khá phổ biến, hầu hết các coder trên thế giới đều có tài khoản GitHub, nếu chưa có thì bạn cũng tạo ngay một cái đi 🙂

Về cơ bản thì bạn sẽ code trang web của bạn trên máy của bạn, sau đó đẩy code lên GitHub rồi lấy code đó xuống PythonAnywhere để hiển thị.

Git

Git là một “hệ thống quản lý phiên bản” được sử dụng bởi rất nhiều coder trên toàn thế giới. Git cho phép theo dõi sự thay đổi của các file theo thời gian để chúng ta có thể xem lại bất cứ lúc nào, trong Microsoft Word cũng có tính năng này nhưng của Git mạnh hơn nhiều.

Bạn có thể tải Git cho Windows về và cài đặt tại địa chỉ https://git-scm.com/. Khi cài đặt bạn nếu không hiểu thì có thể để các thiết lập mặc định là được rồi.

Git theo dõi sự thay đổi của các file trong các repository (viết tắt là repo). Để tạo một repo thì chúng ta mở Command Prompt (cmd), chuyển đến thư mục mà bạn lưu code của website trong đó, rồi gõ các lệnh sau:

C:\PhoCode>git init
Initialized empty Git repository in C:/PhoCode/.git/
C:\PhoCode>git config --global user.name "Pho Code"
C:\PhoCode>git config --global user.email "phocode7@gmail.com"

Bạn lưu ý đặt usernameemail theo ý bạn.

Việc tạo repository chỉ cần thực hiện một lần (tức là sau này chúng ta không cần khai báo username và email nữa). Git sẽ theo dõi sự thay đổi của các file và thư mục trong thư mục này, tuy nhiên sẽ có một số file mà chúng ta muốn bỏ qua. Để làm việc này thì chúng ta tạo một file có tên .gitignore trong thư mục đó. Bạn mở một trình editor (như notepad) lên rồi gõ đoạn sau vào:

*.pyc
__pycache__
myvenv
db.sqlite3
/static
.DS_Store

Lưu ý dấu chấm trong .gitignore rất quan trọng, nếu bạn không lưu tên file như thế được thì dùng Save As…

Nếu trong quá trình làm web mà bạn dùng cơ sở dữ liệu SQLite thì trong thư mục gốc của website sẽ có file db.sqlite3, chúng ta đưa file này vào danh sách trong .gitignore vì trên PythonAnywhere không dùng SQLite.

Tiếp theo chúng ta tạo một ứng dụng Django bình thường rồi đưa tất cả vào trong thư mục của repository. Ví dụ mình có một trang web như sau:

Capture1Capture

(Source: w3schools)

Chúng ta sẽ sử dụng lệnh git add để cập nhật lại nội dung trong repository. Thông thường chúng ta nên dùng lệnh git status trước khi dùng git add để xem mọi sự thay đổi trong repo có đúng như mình đã làm không. Chẳng hạn như bạn tạo file sai, thiếu hoặc thừa file/thư mục…v.v

C:\PhoCode>git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .gitignore
    PhoCode/
    blog/
    manage.py

nothing added to commit but untracked files present (use "git add" to track)

Sau khi đã kiểm tra xong thì chúng ta dùng lệnh addcommit để lưu lại như sau:

C:\PhoCode>git add --all
  [...]
C:\PhoCode>git commit -m "Pho Code site, first commit"
  [...]

Đẩy code lên trên GitHub

Nếu bạn chưa có tài khoản GitHub thì lên github.com tạo một cái.

Sau đó chúng ta cũng tạo một repo trên GitHub với tên tùy ý. Khi tạo thì bỏ check phần Initialize this repository with a README, phần Add .gitignore chọn None, phần Add a license chọn None.

Capture2

Sau khi tạo xong, bạn sẽ được cung cấp URL của repo dưới dạng HTTPS hoặc SSH. Ở đây chúng ta dùng HTTPS, copy dòng đó lại.

Capture

Việc tiếp theo là kết nối repo trên GitHub với repo trên máy của chúng ta bằng cách gõ 2 lệnh sau:

C:\PhoCode>git remote add origin https://github.com/phocode/phocode-site.git
C:\PhoCode>git push -u origin master
...

Tiếp theo bạn nhập username và mật khẩu của tài khoản GitHub là xong, lệnh git remote sẽ kết nối repo trên GitHub với repo trong máy bạn, lệnh git push sẽ đẩy code trong máy bạn lên GitHub, bây giờ code của bạn là nằm ở repo trên GitHub.

Lấy code xuống PythonAnywhere

Đầu tiên bạn vào www.pythonanywhere.com tạo một tài khoản Beginner (miễn phí). Sau đó chúng ta đăng nhập và sẽ được chuyển đến trang bảng điều khiển (dashboard), ở tab Consoles, bạn click dòng Bash để mở trình terminal tại phần Start a new console:

Capture

Màn hình terminal sẽ hiện lên và bạn sẽ thao tác với host thông qua màn hình này. Lưu ý là PythonAnywhere chạy trên nền Linux nên nếu bạn sử dụng Windows thì sẽ thấy hơi khác một tí. Tuy nhiên những câu lệnh của các phần mềm bên thứ 3 (như git) thì vẫn như cũ.

Chúng ta tiến hành lấy code từ GitHub xuống bằng cách dùng lệnh git clone:

Capture

Lệnh git clone sẽ tạo một thư mục có tên giống với repo trên tài khoản GitHub của bạn, trong thư mục này sẽ chứa các file và thư mục mà bạn đã đẩy lên đó từ trước. Bạn có thể dùng lệnh ls để xem:

$ cd phocode.site
$ ls
PhoCode blog manage.py

Tiếp theo chúng ta cần cài Django với phiên bản mà chúng ta đang dùng vào host trên PythonAnywhere, tuy nhiên chúng ta không cài như thường mà sẽ cài vào môi trường ảo, môi trường ảo cho phép chúng ta chạy các chương trình hay các gói Python ở các phiên bản khác nhau để tránh vấn đề xung đột (ví dụ website X chạy trên Django 1.8, trong khi website Y chạy Django 1.9…v.v).

Đầu tiên chúng ta tạo một môi trường ảo với Python 3.5 như sau:

$ virtualenv --python=python3.5 phocode_env

Đoạn code trên sẽ tạo một thư mục với tên phocode_env chứa các thư viện và các công cụ cần thiết, đây là một môi trường Python ảo sử dụng Python 3.5.

Tiếp theo chúng ta yêu cầu sử dụng môi trường này bằng cách gõ lệnh sau:

$ source phocode_env/bin/activate

Cuối cùng chúng ta cài đặt Django với phiên bản mà website của bạn đang sử dụng vào môi trường này bằng trình pip:

(phocode_env)$ pip install django==1.9.4
[...]

Tạo cơ sở dữ liệu trên PythonAnywhere

Như đã nói ở trên, PythonAnywhere có thể sử dụng cơ sở dữ liệu khác với cơ sở dữ liệu mà bạn dùng, nên việc tiếp theo bạn cần làm là tạo cơ sở dữ liệu trên PythonAnywhere như sau:

(phocode_env)$ python manage.py migrate
System check identified some issues:
[...]

Tạo web app

Chúng ta đã lấy được code, có cơ sở dữ liệu và có môi trường ảo. Việc cần làm tiếp theo là tạo một Web App trên PythonAnywhere.

Chúng ta thoát khỏi màn hình terminal (bằng cách bấm vào logo của PythonAnywhere), sau đó vào tab Web, click Add a new web app. Một hộp thoại mở lên thông báo cho bạn biết do chúng ta đang dùng bản miễn phí nên trang web sẽ có tên miền là <username>.pythonanywhere.com (ngoài ra web app này chỉ có thời gian hiệu lực là 3 tháng), click Next, tiếp theo chúng ta chọn Manual Configuration (chứ không chọn Django), tiếp theo chọn phiên bản Python 3.5 rồi click Next và đợi.

Tiếp theo bạn sẽ được chuyển đến trang cấu hình web app, chúng ta sẽ chỉ định web app sử dụng môi trường ảo mà chúng ta đã tạo ra hồi nãy. Trong phần VirtualEnv, click vào dòng Enter path to a virtualenv, if desired, rồi điền vào đường dẫn đến thư mục chứa môi trường ảo mà chúng ta đã tạo, thường là /home/<PythonAnywhere-username>/phocode-site/phocode_env.

Capture

 

 

 

 

Nếu bạn không biết đường dẫn chính xác là gì hoặc muốn chắc ăn, bạn có thể mở trình terminal lên, dùng lệnh cd để chuyển đến thư mục đó rồi dùng lệnh pwd để biết đường dẫn chính xác.

Capture1

Sau đó click vào dấu tick màu xanh để lưu đường dẫn môi trường ảo.

Cấu hình file WSGI

Django sử dụng giao thức WSGI, đây là chuẩn hiển thị web của Python. Khi bạn tạo một project Django trên máy thì bạn sẽ có một file tên wsgi.py.

Trong tab Web, chúng ta sửa file WSGI bằng cách click vào dòng /var/www/<PythonAnywhere-username>_pythonanywhere_com_wsgi.py trong phần Code. Chúng ta xóa toàn bộ nội dung file đó và thay bằng đoạn code sau:

import os
import sys

path = '/home/<PythonAnywhere-username>/phocode-site'
if path not in sys.path:
 sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'PhoCode.settings'

from django.core.wsgi import get_wsgi_application
from django.contrib.staticfiles.handlers import StaticFilesHandler
application = StaticFilesHandler(get_wsgi_application())

Lưu ý biến path là đường dẫn tới thư mục gốc chứa code của bạn, biến os.environ có phần đầu là tên thư mục chứa file settings.py. 

Lớp StaticFilesHandler chịu trách nhiệm việc tải các file tĩnh (như CSS, Javascript…) từ các site khác về.

Thế là xong, bây giờ bạn về lại tab Web, click vào nút Reload <PythonAnywhere-username>.pythonanywhere.com màu xanh lá cây rồi đợi, sau đó bạn có thể nhập đường dẫn đó vào trình duyệt để xem website của mình được rồi.

Capture

Nếu có bất kì lỗi gì xảy ra mà trang web không thể hiển thị hay hiển thị sai, bạn có thể xem thông báo lỗi trong file error.log, bạn có thể mở tìm thấy file này ở tab Web, phần Log files. Một số lỗi thường xảy ra là do:

  • Quên tạo môi trường ảo, quên kích hoạt môi trường ảo, quên cài Django vào môi trường ảo, quên tạo lại cơ sở dữ liệu.
  • Đường dẫn đến thư mục môi trường ảo thiết lập trong tab Web bị sai.
  • Thiết lập file WSGI sai
  • Phiên bản Python trong khi tạo môi trường ảo và phiên bản Python trong Web App không trùng khớp.
4.8 6 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.

5 Comments
Inline Feedbacks
View all comments
Kha
Kha
7 năm trước

Xin chào ạ, mình thấy bài viết của Phở Code rất hay, mình muốn hỏi , bên phở có thể tư vấn thâm cho mình về lập trình python đc không ạ, cám ơn nhiều ạ!

Vu Nguyen
Vu Nguyen
3 năm trước

Cho minh hoi. Nếu là trang web đã có tên miền thì có thể sửa dụng theo cách này không. Và ở việt nam thì mình có thể đưa mua hosting của bên dịch vụ nào. Cảm ơn bạn.

hùng
3 năm trước

chào mình sẽ làm web bằng host này,vì anaconda không hỗ trợ python 3.9 nên mình lúc đầu upload vô heroku thất bại vì dùng bản 3.9 ,giờ sẽ chuyển sang host này,mong không bị lỗi failed error,không push được

hùng
3 năm trước

sao mình up hoài không được nó cứ báo lỗi logon failed,comman failed,error failed