django-debug-thanh công cụ không hiển thị


132

Tôi đã xem xét các câu hỏi khác và không thể tìm ra ...

Tôi đã làm như sau để cài đặt django-debug-thanh công cụ:

  1. Pip cài đặt django-debug-thanh công cụ
  2. được thêm vào các lớp trung gian:
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',
)

Đã thêm 3 INTERNAL_IPS:

INTERNAL_IPS = ('174.121.34.187',)

4 Đã thêm debug_toolbar cho các ứng dụng đã cài đặt

Tôi không nhận được bất kỳ lỗi hay bất cứ điều gì và thanh công cụ không hiển thị trên bất kỳ trang nào, ngay cả quản trị viên.

Tôi thậm chí đã thêm thư mục của các mẫu debug_toolbar vào TEMPLATE_DIRS


9
Nếu bạn đang sử dụng Vagrant, hãy chắc chắn rằng bạn INTERNAL_IPSlà chính xác. Một cách để kiểm tra là trong chế độ xem, in của bạn request.META['REMOTE_ADDR'], sau đó thêm nó vào INTERNAL_IPS.
Sẽ

1
Điều này có thể giúp ai đó. Tôi đã thử bằng cách thêm '*'vào các IP nội bộ, nhưng điều đó không hiệu quả. Bạn phải nhập IP cụ thể.
Luv33preet

Trong cài đặt của tôi, giờ đây chỉ là PHẦN MỀM, không phải là MIDDLEWARE_CLASSES
bertie

Câu trả lời:


174

Câu hỏi ngu ngốc, nhưng bạn đã không đề cập đến nó, vì vậy ... Điều gì được DEBUGđặt thành? Nó sẽ không tải trừ khi nó True.

Nếu nó vẫn không hoạt động, hãy thử thêm '127.0.0.1' vào INTERNAL_IPS.

CẬP NHẬT

Đây là một động thái cuối cùng, bạn không cần phải làm điều này, nhưng nó sẽ hiển thị rõ ràng nếu chỉ có một số vấn đề về cấu hình hoặc liệu có vấn đề nào lớn hơn không.

Thêm phần sau vào settings.py:

def show_toolbar(request):
    return True
SHOW_TOOLBAR_CALLBACK = show_toolbar

Điều đó sẽ loại bỏ hiệu quả tất cả các kiểm tra bằng thanh công cụ gỡ lỗi để xác định xem nó nên hay không nên tự tải; nó sẽ luôn luôn tải. Chỉ để lại mục đích thử nghiệm, nếu bạn quên và khởi chạy cùng với nó, tất cả khách truy cập của bạn cũng sẽ thấy thanh công cụ gỡ lỗi của bạn.

Để biết cấu hình rõ ràng, cũng xem các tài liệu cài đặt chính thức ở đây .

EDIT (17/03/2015):

Rõ ràng cú pháp cho tùy chọn hạt nhân đã thay đổi. Bây giờ trong từ điển của riêng mình:

def show_toolbar(request):
    return True
DEBUG_TOOLBAR_CONFIG = {
    "SHOW_TOOLBAR_CALLBACK" : show_toolbar,
}

Các thử nghiệm của họ sử dụng từ điển này.


3
Vâng, vì vậy có một số vấn đề lớn hơn đang diễn ra ở đây. Nếu bạn đang sử dụng một cái gì đó ngoài runserverviệc đảm bảo bạn khởi động lại nó. Heck, khởi động lại runserver, quá. Hãy chắc chắn rằng những thay đổi của bạn đối với settings.txt thực sự đã được lưu / cam kết. Bạn có thể muốn thử xóa các tệp * .pyc. Trong * nix, bạn có thể làm điều đó một cách đơn giản với find . -name "*.pyc" -exec rm {} \;từ gốc dự án. Cuối cùng, chạy python manage.py shellvà thực hiện from django.conf import settingsvà kiểm tra giá trị của settings.INSTALLED_APPs.
Chris Pratt

3
Tôi không chắc ý của bạn với câu hỏi cuối cùng là gì, nhưng nếu bạn đang đề cập đến INTERNAL_IPS, những câu hỏi đó dành cho khách hàng không phải là máy chủ (Django). Nói cách khác, bạn đặt địa chỉ IP của bạn để bạn có thể thấy thanh công cụ gỡ lỗi, bất kể IP nào trang web có thể đang chạy.
Chris Pratt

10
INTERNAL_IPS đã giúp tôi hiểu rõ .. Cảm ơn thông tin
Lee

12
hoặc thậm chíSHOW_TOOLBAR_CALLBACK = lambda x: True
John Mee

6
@schillingt vâng, xin lỗi tôi nên kiểm tra cái này. Tôi nghĩ rằng tôi đã phải chạy collectstaticđể làm cho mọi thứ xuất hiện.
Rob Grant

80

Thanh công cụ gỡ lỗi muốn địa chỉ IP trong request.META ['REMOTE_ADDR'] được đặt trong cài đặt INTERNAL_IPS. Ném vào một tuyên bố in trong một trong những quan điểm của bạn như sau:

print("IP Address for debug-toolbar: " + request.META['REMOTE_ADDR'])

Và sau đó tải trang đó. Đảm bảo rằng IP nằm trong cài đặt INTERNAL_IPS của bạn trong settings.py.

Thông thường tôi nghĩ bạn sẽ có thể xác định địa chỉ dễ dàng bằng cách xem địa chỉ IP của máy tính, nhưng trong trường hợp của tôi, tôi đang chạy máy chủ trong Hộp ảo với chuyển tiếp cổng ... và ai biết chuyện gì đã xảy ra. Mặc dù không thấy nó ở bất cứ đâu trong ifconfig trên VB hoặc hệ điều hành của riêng tôi, IP xuất hiện trong khóa REMOTE_ADDR là thủ thuật kích hoạt thanh công cụ.


2
Tôi đã truy cập trang của mình thông qua nginx proxy, vì vậy remote_addr là proxy của tôi chứ không phải ip thật của tôi. Tôi cần thêm địa chỉ IP proxy của mình INTERNAL_IPSvà nó bắt đầu hoạt động.
Kurt

1
Từ máy khách của tôi trong VirtualBox, máy chủ của tôi được xem là 10.0.0.2, nếu nó có thể giúp được ai đó. :)
mrmuggles

RẤT hữu ích để KIỂM TRA IP nếu bạn sử dụng một số ảo hóa như VAGRANT
andilabs

3
Trong docker, REMOTE_ADDR của tôi không như tôi nghĩ.
Aaron McMillin


28

Phiên bản ổn định hiện tại 0.11.0 yêu cầu những điều sau đây phải đúng cho thanh công cụ được hiển thị:

Cài đặt tập tin:

  1. DEBUG = True
  2. INTERNAL_IPSđể bao gồm địa chỉ IP trình duyệt của bạn, trái ngược với địa chỉ máy chủ. Nếu duyệt cục bộ thì nên INTERNAL_IPS = ('127.0.0.1',). Nếu duyệt từ xa chỉ cần xác định địa chỉ công cộng của bạn .
  3. Ứng dụng debug_toolbar được cài đặt tức là INSTALLED_APPS = (..., 'debug_toolbar',)
  4. Lớp trung gian thanh công cụ gỡ lỗi được thêm vào tức là MIDDLEWARE_CLASSES = ('debug_toolbar.middleware.DebugToolbarMiddleware', ...). Nó nên được đặt càng sớm càng tốt trong danh sách.

Tệp mẫu:

  1. Phải là loại text/html
  2. Phải đóng cửa </html> thẻ

Tệp tĩnh:

Nếu bạn đang phục vụ nội dung tĩnh, hãy đảm bảo bạn thu thập css, js và html bằng cách thực hiện:

./manage.py collectstatic 


Lưu ý về các phiên bản sắp tới của django-debug-thanh công cụ

Các phiên bản phát triển mới hơn đã thêm mặc định cho các cài đặt điểm 2, 3 và 4, điều này làm cho cuộc sống đơn giản hơn một chút, tuy nhiên, như với bất kỳ phiên bản phát triển nào, nó đều có lỗi. Tôi thấy rằng phiên bản mới nhất từ ​​git đã dẫn đến mộtImproperlyConfigured lỗi khi chạy qua nginx / uwsgi.

Dù bằng cách nào, nếu bạn muốn cài đặt phiên bản mới nhất từ ​​github run:

pip install -e git+https://github.com/django-debug-toolbar/django-debug-toolbar.git#egg=django-debug-toolbar 

Bạn cũng có thể sao chép một cam kết cụ thể bằng cách thực hiện:

pip install -e git+https://github.com/django-debug-toolbar/django-debug-toolbar.git@ba5af8f6fe7836eef0a0c85dd1e6d7418bc87f75#egg=django_debug_toolbar

2
Trên thực tế, thẻ <body> </ body> của nó không cần thiết </ html>
Zgr3doo

20

Tôi đã thử mọi cách, từ cài đặt DEBUG = True, đến cài đặt INTERNAL_IPSđến địa chỉ IP của khách hàng và thậm chí định cấu hình Thanh công cụ gỡ lỗi Django (lưu ý rằng các phiên bản gần đây tự động thực hiện tất cả các cấu hình, chẳng hạn như thêm phần mềm trung gian và URL). Không có gì hoạt động trong một máy chủ phát triển từ xa (mặc dù nó hoạt động cục bộ). Điều duy nhất làm việc là cấu hình thanh công cụ như sau:

DEBUG_TOOLBAR_CONFIG = {
    "SHOW_TOOLBAR_CALLBACK" : lambda request: True,
}

Điều này thay thế phương thức mặc định quyết định xem thanh công cụ có được hiển thị hay không và luôn trả về true.


16

Docker

Nếu bạn đang phát triển với máy chủ Django trong bộ chứa Docker có docker, các hướng dẫn cho phép thanh công cụ không hoạt động. Lý do có liên quan đến thực tế là địa chỉ thực tế mà bạn cần thêm vào INTERNAL_IPSsẽ là một cái gì đó năng động, như là 172.24.0.1. Thay vì cố gắng tự động thiết lập giá trị của INTERNAL_IPS, giải pháp đơn giản là thay thế chức năng cho phép thanh công cụ, settings.pyví dụ:

DEBUG_TOOLBAR_CONFIG = {
    'SHOW_TOOLBAR_CALLBACK': lambda _request: DEBUG
}


Điều này cũng sẽ làm việc cho các tình huống định tuyến động khác, như vagrant.


Dưới đây là một số chi tiết cho những người tò mò. Mã trong django_debug_tool xác định xem có hiển thị thanh công cụ kiểm tra giá trị REMOTE_ADDRnhư thế này không:

if request.META.get('REMOTE_ADDR', None) not in INTERNAL_IPS:
       return False

vì vậy nếu bạn không thực sự biết giá trị REMOTE_ADDRdo định tuyến docker động của mình, thanh công cụ sẽ không hoạt động. Bạn có thể sử dụng lệnh mạng docker để xem các giá trị IP động, ví dụ:docker network inspect my_docker_network_name


15

Tôi có thanh công cụ làm việc hoàn hảo. Với cấu hình này:

  1. DEBUG = True
  2. INTERNAL_IPS = ('127.0.0.1', '192.168.0.1',)
  3. DEBUG_TOOLBAR_CONFIG = {'INTERCEPT_REDIRECTS': False,}
  4. Phần mềm trung gian là yếu tố đầu tiên trong MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = (
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

Tôi hy vọng nó sẽ giúp


2
Bạn có lẽ nên xác định lại địa chỉ IP của bạn từ câu trả lời của bạn. Vì hầu hết mọi người đang chạy băng thông rộng ngày nay và hầu hết các kết nối băng thông rộng hiếm khi thay đổi địa chỉ IP nếu có. Bạn có thể không muốn điều đó treo xung quanh các interwebs.
Chris Pratt

192.168. *. * Là một địa chỉ IP cục bộ nội bộ được bộ định tuyến gán cho máy tính. Địa chỉ IP bên ngoài là khác nhau.
Robeezy

@rpod đó chính xác là lý do tại sao ai đó chỉnh sửa nó.
Yuji 'Tomita' Tomita

Nếu bạn đang sử dụng Tệp Một Cấu hình Đúng và chỉ muốn Thanh công cụ gỡ lỗi trong dev, thay vì thêm nó vào middleware_groupes trong base.pybạn có thể muốn thêm tệp này vào local.py: MIDDLEWARE_CLASSES = ('debug_toolbar.middleware.DebugToolbarMiddleware',) + MIDDLEWARE_CLASSES.
Rob Grant

12

Thêm vào 10.0.2.2 vào INTERNAL_IPS của bạn trên Windows, nó được sử dụng với nội bộ mơ hồ

INTERNAL_IPS = ('10 .0.2.2 ',)

Điều này nên làm việc.


1
Xác nhận điều này đã khắc phục sự cố của tôi bằng Vagrant trên OSX.
Josh

Đây là giải pháp chính xác nhất và có thể xảy ra nhất và đơn giản nhất :) Xác nhận làm việc bằng cách sử dụng vagrant trên windows 7
mislavcimpersak

6

Tôi đã có cùng một vấn đề và cuối cùng đã giải quyết nó sau một số googling.

Trong INTERNAL_IPS, bạn cần có địa chỉ IP của máy khách .


4

Một điều khác có thể khiến thanh công cụ bị ẩn là nếu nó không thể tìm thấy các tệp tĩnh cần thiết. Các mẫu debug_toolbar sử dụng thẻ mẫu {{STATIC_URL}}, vì vậy hãy đảm bảo có một thư mục trong các tệp tĩnh của bạn được gọi là thanh công cụ gỡ lỗi.

Lệnh quản lý tập hợp nên đảm nhiệm việc này trên hầu hết các cài đặt.


3

Tôi đã thử cấu hình từ cookiecutter-django của pydanny và nó hoạt động với tôi:

# django-debug-toolbar
MIDDLEWARE_CLASSES = Common.MIDDLEWARE_CLASSES + ('debug_toolbar.middleware.DebugToolbarMiddleware',)
INSTALLED_APPS += ('debug_toolbar',)

INTERNAL_IPS = ('127.0.0.1',)

DEBUG_TOOLBAR_CONFIG = {
    'DISABLE_PANELS': [
        'debug_toolbar.panels.redirects.RedirectsPanel',
    ],
    'SHOW_TEMPLATE_CONTEXT': True,
}
# end django-debug-toolbar

Tôi chỉ sửa đổi nó bằng cách thêm 'debug_toolbar.apps.DebugToolbarConfig'thay vì 'debug_toolbar'như được đề cập trong các tài liệu django-debug-thanh công cụ chính thức , như tôi đang sử dụng Django 1.7.


2

Một bổ sung cho câu trả lời trước:

nếu thanh công cụ không hiển thị, nhưng nó tải trong html (kiểm tra html trang web của bạn trong trình duyệt, cuộn xuống)

vấn đề có thể là không tìm thấy các tệp tĩnh của thanh công cụ gỡ lỗi (bạn cũng có thể thấy điều này trong nhật ký truy cập trang web của mình, ví dụ: lỗi 404 cho /static/debug_toolbar/js/toolbar.js)

Nó có thể được sửa theo cách sau đây (ví dụ cho nginx và apache):

cấu hình nginx:

location ~* ^/static/debug_toolbar/.+.(ico|css|js)$ {
    root [path to your python site-packages here]/site-packages/debug_toolbar;
}

cấu hình apache:

Alias /static/debug_toolbar [path to your python site-packages here]/site-packages/debug_toolbar/static/debug_toolbar

Hoặc là:

manage.py collectstatic

thêm về collstatic ở đây: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#collectstatic

Hoặc di chuyển thủ công thư mục debug_toolbar của tệp tĩnh debug_toolbar vào thư mục tệp tĩnh đã đặt của bạn


2

Trong trường hợp của tôi, đó là một vấn đề khác chưa được đề cập ở đây: Tôi đã có GZipMiddleware trong danh sách các phần mềm trung gian.

Vì cấu hình tự động của thanh công cụ gỡ lỗi đặt phần mềm trung gian của thanh công cụ gỡ lỗi lên hàng đầu, nó chỉ nhận được "xem" HTML được nén, mà nó không thể thêm thanh công cụ.

Tôi đã xóa GZipMiddleware trong cài đặt phát triển của mình. Thiết lập cấu hình thanh công cụ gỡ lỗi theo cách thủ công và đặt phần mềm trung gian sau GZip cũng sẽ hoạt động.


Ngay cả việc bật GZip ở cấp độ xem gzip_pagecũng khiến thanh công cụ biến mất. docs.djangoproject.com/en/2.0/topics/http/decorators/ Khăn
Brachamul

2

Trong trường hợp của tôi, tôi chỉ cần xóa tệp python đã biên dịch ( *.pyc)


Cảm ơn bạn cho nhận xét này, nó đã cứu tôi suy sụp tinh thần sáng nay. Nếu mọi thứ khác có vẻ đúng - và dự án này đã hoạt động tốt trước đây đối với tôi - hãy thử điều này và xem liệu nó có giải quyết được không. DDT HTML / JS đã có trên trang, mọi thứ đều ổn, nhưng nó vẫn không thực sự xuất hiện. Tôi xóa các tệp pyc và nó bắt đầu hiển thị lại
Shane

2

django 1.8.5:

Tôi đã phải thêm phần sau vào tệp url.txt của dự án để hiển thị thanh công cụ gỡ lỗi. Sau đó thanh công cụ gỡ lỗi được hiển thị.

 from django.conf.urls import include
 from django.conf.urls import patterns
 from django.conf import settings


  if settings.DEBUG:
      import debug_toolbar
      urlpatterns += patterns('',
              url(r'^__debug__/', include(debug_toolbar.urls)),
              )

django 1.10: và cao hơn:

from django.conf.urls import include, url
from django.conf.urls import patterns
from django.conf import settings


if settings.DEBUG:

  import debug_toolbar
  urlpatterns =[
         url(r'^__debug__/', include(debug_toolbar.urls)),
         ] + urlpatterns

Cũng đừng quên đưa debug_toolbar vào phần mềm trung gian của bạn. Thanh công cụ gỡ lỗi hầu hết được triển khai trong một phần mềm trung gian. Kích hoạt nó trong mô-đun cài đặt của bạn như sau: (django phiên bản mới hơn)


MIDDLEWARE = [
# ...
'debug_toolbar.middleware.DebugToolbarMiddleware',
#

Phần mềm trung gian kiểu cũ: (cần phải có _CLASSES keywork trong Middleware)

MIDDLEWARE_CLASSES = [
# ...
'debug_toolbar.middleware.DebugToolbarMiddleware',
# ...
]

1

Đây không phải là trường hợp của tác giả cụ thể này nhưng tôi vừa phải vật lộn với Thanh công cụ gỡ lỗi không hiển thị và sau khi làm mọi thứ họ chỉ ra, tôi phát hiện ra đó là một vấn đề với thứ tự MIDDLEWARE. Vì vậy, đặt phần mềm trung gian sớm trong danh sách có thể làm việc. Của tôi là đầu tiên:

MIDDLEWARE_CLASSES = ( 'debug_toolbar.middleware.DebugToolbarMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'dynpages.middleware.DynpageFallbackMiddleware', 'utils.middleware.UserThread', )


0

bạn phải chắc chắn rằng có một thẻ đóng trong các mẫu của bạn.

Vấn đề của tôi là không có thẻ html thông thường trong các mẫu của tôi, tôi chỉ hiển thị nội dung ở dạng văn bản thuần túy. Tôi đã giải quyết nó bằng cách kế thừa mọi tệp html từ base.html, có thẻ.


0

Đối với tôi, việc này đơn giản như việc gõ 127.0.0.1:8000vào thanh địa chỉ, thay vì localhost:8000rõ ràng là không khớp với INTERNAL_IPS.


0

Tôi gặp vấn đề tương tự, tôi đã giải quyết nó bằng cách xem nhật ký lỗi của Apache. Tôi đã nhận được apache chạy trên mac os x với mod_wsgi Thư mục tamplete của debug_toolbar không được tải

Nhật ký mẫu:

==> /private/var/log/apache2/dummy-host2.example.com-error_log <==
[Sun Apr 27 23:23:48 2014] [error] [client 127.0.0.1] File does not exist: /Library/WebServer/Documents/rblreport/rbl/static/debug_toolbar, referer: http://127.0.0.1/

==> /private/var/log/apache2/dummy-host2.example.com-access_log <==
127.0.0.1 - - [27/Apr/2014:23:23:48 -0300] "GET /static/debug_toolbar/css/toolbar.css HTTP/1.1" 404 234 "http://127.0.0.1/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:28.0) Gecko/20100101 Firefox/28.0"

Tôi chỉ cần thêm dòng này vào tệp Virtualhost của mình:

Alias /static/debug_toolbar /Library/Python/2.7/site-packages/debug_toolbar/static/debug_toolbar
  • Tất nhiên bạn phải thay đổi đường dẫn python của bạn

0

Tôi đã có cùng một vấn đề sử dụng Vagrant. Tôi đã giải quyết vấn đề này bằng cách thêm ::ffff:192.168.33.1vào INTERNAL_IPS như ví dụ dưới đây.

INTERNAL_IPS = (
    '::ffff:192.168.33.1',
)

Hãy nhớ rằng đó 192.168.33.10là IP trong mạng riêng của tôi trong Vagrantfile.


0

Tôi gặp vấn đề này và phải cài đặt thanh công cụ gỡ lỗi từ nguồn.

Phiên bản 1.4 có một vấn đề mà nó bị ẩn nếu bạn sử dụng PureCSS và các khung CSS khác.

Điều này là cam kết sửa chữa điều đó.

Các tài liệu giải thích làm thế nào để cài đặt từ nguồn.


0

Đối với bất kỳ ai đang sử dụng Pycharm 5 - gỡ lỗi mẫu không hoạt động ở đó trong một số phiên bản. Vesions cố định trong 5.0.4, bị ảnh hưởng - 5.0.1, 5.0.2 Kiểm tra ra vấn đề

Hãy dành nhiều thời gian để tìm hiểu điều đó. Có lẽ sẽ giúp được ai đó


0

Trong mã tôi đang làm việc, nhiều yêu cầu nhỏ đã được thực hiện trong khi xử lý yêu cầu chính (trường hợp sử dụng rất cụ thể). Chúng là các yêu cầu được xử lý bởi cùng một chủ đề của Django. Thanh công cụ gỡ lỗi Django (DjDT) không mong đợi hành vi này và bao gồm các thanh công cụ của DjDT cho phản hồi đầu tiên và sau đó nó xóa trạng thái của nó cho luồng. Vì vậy, khi yêu cầu chính được gửi trở lại trình duyệt, DjDT không được đưa vào phản hồi.

Bài học rút ra: DjDT lưu trạng thái của nó trên mỗi luồng. Nó loại bỏ trạng thái cho một chủ đề sau phản ứng đầu tiên.


0

Những gì đã cho tôi là một trình duyệt lỗi thời!

Nhận thấy rằng nó tải một số bảng định kiểu từ thanh công cụ gỡ lỗi và đoán nó có thể là một vấn đề mặt trước.


-1

Một điều ngu ngốc đã cho tôi .. rằng nếu bạn sử dụng apache wsgi, hãy nhớ chạm vào tệp .wsgi để buộc mã hóa lại mã của bạn. chỉ lãng phí 20 phút thời gian của tôi để gỡ lỗi lỗi ngu ngốc :(

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.