Bagaimana mengelola pelaporan kesalahan¶
Ketika anda sedang menjalankan situs umum anda harus selalu mematikan pengaturan DEBUG
. Itu akan membuat peladen anda berjalan lebih cepat, dan juga akan mencegah pengguna hahat dari melihat rincian dari aplikasi anda yang dapat diungkap dengan kesalahan halaman.
However, running with DEBUG
set to False
means you'll never see
errors generated by your site -- everyone will instead see your public error
pages. You need to keep track of errors that occur in deployed sites, so Django
can be configured to create reports with details about those errors.
Surel laporan¶
Kesalahan peladen¶
When DEBUG
is False
, Django will email the users listed in the
ADMINS
setting whenever your code raises an unhandled exception and
results in an internal server error (strictly speaking, for any response with
an HTTP status code of 500 or greater). This gives the administrators immediate
notification of any errors. The ADMINS
will get a description of the
error, a complete Python traceback, and details about the HTTP request that
caused the error.
Catatan
Agar mengirim surel, Django membutuhkan beberapa pengaturan mengatakannya bagaimana terhubung ke peladen surat anda. Setidaknya, anda akan butuh menentukan EMAIL_HOST
dan kemungkinan EMAIL_HOST_USER
dan EMAIL_HOST_PASSWORD
, meskipun pengaturan lainnya mungkin tidak juga dibutuhkan tergantung pada konfigurasi peladen surat anda. Rundingkan the Django settings documentation untuk daftar penuh dari pengaturan terkait-surel.
Secara awal, Django akan mengirim surel dari root@localhost. Bagaimanapun, beberapa penyedia surat menolak semua surel dari alamat ini. Untuk menggunakan alamat pengirim berbeda, rubah pengaturan SERVER_EMAIL
.
Untuk mengaktifkan perilaku ini, masukkan alamat surel dari penerima di bagian ADMINS
.
Lihat juga
Surel kesalahan peladen dikirim menggunakan kerangka pencatatan, jadi anda dapat menyesuaikan perilaku ini dengan customizing your logging configuration.
kesalahan 404¶
Django juga dapat dikonfirgasi untuk mengirimkan surel kesalahan tentang tautan yang tidak ditemukan (404 "page not found" errors). Django mengirim surel tentang error 404 ketika:
DEBUG
adalahFalse
;- Pengaturan
MIDDLEWARE
anda termasukdjango.middleware.common.BrokenLinkEmailsMiddleware
.
If those conditions are met, Django will email the users listed in the
MANAGERS
setting whenever your code raises a 404 and the request has
a referer. It doesn't bother to email for 404s that don't have a referer --
those are usually people typing in broken URLs or broken web bots. It also
ignores 404s when the referer is equal to the requested URL, since this
behavior is from broken web bots too.
Catatan
BrokenLinkEmailsMiddleware
harus muncul sebelum middleware lain yang memotong kesalahan 404, seperti LocaleMiddleware
atau FlatpageFallbackMiddleware
. Letakkan ke arah atas dari setelan MIDDLEWARE
.
Anda dapat memberitahu Django untuk menghentikan pelaporan tertentu 404 dengan merubah pengaturan IGNORABLE_404_URLS
. Dia harus menjadi daftar dari obyek ungkapan biasa tersusun. Sebagai contoh:
import re
IGNORABLE_404_URLS = [
re.compile(r"\.(php|cgi)$"),
re.compile(r"^/phpmyadmin/"),
]
Dalam contoh ini, sebuah 404 pada setiap URL berakhiran dengan .php
atau .cgi
akan tidak dilaporkan. Juga tidak akan URL apapun dimulai dengan /phpmyadmin/
.
Contoh berikut menunjukkan bagaimana mengeluarkan beberapa URL biasa yang perambah dan penjilat sering diminta:
import re
IGNORABLE_404_URLS = [
re.compile(r"^/apple-touch-icon.*\.png$"),
re.compile(r"^/favicon\.ico$"),
re.compile(r"^/robots\.txt$"),
]
(Perhatikan bahwa ini adalah regular expression, jadi kita tuliskan garis miring terbalik di depan titik untuk melepaskannya)
Jika anda suka menyesuaikan perilaku dari django.middleware.common.BrokenLinkEmailsMiddleware
lebih lanjut (sebagai contoh untuk mengabaikan permintaan datang dari penjilat jaringan), anda harus mensubkelaskannya dan menimpa caranya.
Lihat juga
Kesalahan 404 dicatat menggunakan kerangka pencatatan. Secara awal, rekaman catatan ini diabaikan, tetapi anda dapat menggunakan mereka untuk kesalahan pelaporan dengan menulis sebuah penanganan configuring logging dengan benar.
Menyaring laporan kesalahan¶
Peringatan
Filtering sensitive data is a hard problem, and it's nearly impossible to guarantee that sensitive data won't leak into an error report. Therefore, error reports should only be available to trusted team members and you should avoid transmitting error reports unencrypted over the internet (such as through email).
Menyaring informasi rahasia¶
Laporan kesalahan sangat membantu untuk memeriksa kesalahan, jadi dia umumnya berguna untuk merekam informasi terkait tentang kesalahan-kesalahan tersebut sebanyak mungkin. Sebagai contoh, secara awal rekaman Django full traceback untuk dimunculkan pengecualian, setiap variabel lokal full traceback, dan attributes HttpRequest
.
Bagaimanapun, terkadang jenis-jenis informasi tertentu mungkin terlalu sensitif dan dengan demikian mungkin tidak sesuai untuk terus melacak, sebagai contoh, sandi pengguna atau angka kartu kredit. Jadi di tambahaan untuk menyaring pengaturan yang muncul menjadi sensitif seperti digambarkan dalam dokumentasi DEBUG
, Django menawarkan sekumpulan fungsi penghias untuk membantu anda mengendalikan informasi mana harus disaring dari laporan kesalahan dalam lingkungan produksi (yaitu, dimana DEBUG
disetel ke False
): sensitive_variables()
dan sensitive_post_parameters()
.
-
sensitive_variables
(*variables)¶ Jika sebuah fungsi (baik sebuah tampilan atau callback umum apapun) dalam kode anda menggunakan variabel lokal rentan mengandung informasi sensitif, anda mungkin mencegah nilai-nilai variabel tersebut dari menjadi disertakan dalam laporan kesalahan menggunakan penghias
sensitive_variables
:from django.views.decorators.debug import sensitive_variables @sensitive_variables("user", "pw", "cc") def process_info(user): pw = user.pass_word cc = user.credit_card_number name = user.name ...
In the above example, the values for the
user
,pw
andcc
variables will be hidden and replaced with stars (**********
) in the error reports, whereas the value of thename
variable will be disclosed.Untuk secara sistematis menyembunyikan semua variabel lokal dari sebuah fungsi dari laporan kesalahan, jangan menyediakan argumen apapun pada decorator
sensitive_variables
:@sensitive_variables() def my_function(): ...
Ketika menggunakan sejumlah dekorator
Jika variabel anda ingin sembunyikan adalah juga argumen fungsi (sebagai contoh '
user
’ dalam contoh berikut), dan jika fungsi dihiasi mempunyai banyak decorator, kemudian pastikan menempatkan@sensitive_variables
pda atas dari rantai decorator. Cara ini dia akan juga menyembunyikan argumen fungsi ketika dia mendapatkan dilewati melalui decorator lain:@sensitive_variables("user", "pw", "cc") @some_decorator @another_decorator def process_info(user): ...
Peringatan
Due to the machinery needed to cross the sync/async boundary,
sync_to_async()
andasync_to_sync()
are not compatible withsensitive_variables()
.Jika menggunakan adaptor ini dengan variabel sensitif, pastikan untuk mengaudit pelaporan pengecualian, dan pertimbangkan menerapkan custom filter jika memungkinkan.
-
sensitive_post_parameters
(*parameters)¶ Jika satu dari tampilan anda menerima sebuah obyek
HttpRequest
denganPOST parameters
rentan untuk mengandung informasi sensitif, anda mungkin mencegah nilai-nilai dari parameter tersebut dari menjadi disertakan dalam laporan kesalahan menggunakan penghiassensitive_post_parameters
:from django.views.decorators.debug import sensitive_post_parameters @sensitive_post_parameters("pass_word", "credit_card_number") def record_user_profile(request): UserProfile.create( user=request.user, password=request.POST["pass_word"], credit_card=request.POST["credit_card_number"], name=request.POST["name"], ) ...
In the above example, the values for the
pass_word
andcredit_card_number
POST parameters will be hidden and replaced with stars (**********
) in the request's representation inside the error reports, whereas the value of thename
parameter will be disclosed.Untuk secara sistematis menyembunyikan semua parameter POST dari sebuah permintaan dalam laporan kesalahan, jangan menyediakan argumen apapun pada decorator
sensitive_variables
:@sensitive_post_parameters() def my_view(request): ...
Semua parameter POST adalah sistematis disaring keluar dari laporan kesalahan untuk tampilan
django.contrib.auth.views
tertentu (login
,password_reset_confirm
,password_change
, danadd_view
danuser_change_password
dalam adminauth
) untuk mencegah dari pembocoran dari informasi sensitif seperti sandi pengguna.
Penyesuaian laporan kesalahan¶
All sensitive_variables()
and sensitive_post_parameters()
do is,
respectively, annotate the decorated function with the names of sensitive
variables and annotate the HttpRequest
object with the names of sensitive
POST parameters, so that this sensitive information can later be filtered out
of reports when an error occurs. The actual filtering is done by Django's
default error reporter filter:
django.views.debug.SafeExceptionReporterFilter
. This filter uses the
decorators' annotations to replace the corresponding values with stars
(**********
) when the error reports are produced. If you wish to
override or customize this default behavior for your entire site, you need to
define your own filter class and tell Django to use it via the
DEFAULT_EXCEPTION_REPORTER_FILTER
setting:
DEFAULT_EXCEPTION_REPORTER_FILTER = "path.to.your.CustomExceptionReporterFilter"
Anda dapat juga mengendalikan cara lebih kecil penyaring mana untuk digunakan dalam tampilan yang diberikan oleh pengaturan atribut exception_reporter_filter
HttpRequest
:
def my_view(request):
if request.user.is_authenticated:
request.exception_reporter_filter = CustomExceptionReporterFilter()
...
Kelas saringan penyesuaian anda perlu mewarisi dari django.views.debug.SafeExceptionReporterFilter
dan mungkin menimpa atribut dan metode berikut:
-
class
SafeExceptionReporterFilter
¶ -
cleansed_substitute
¶ Nilai string untuk mengganti nilai sensitif. Secara awalan itu mengganti nilai dari variabel sensitif dengan bintang (
**********
).
Sebuah obyek regular expression tersusun digunakan untuk mencocokkan pengaturan dan nilai
request.META
yang dianggap sensitif. Secara awalan setara pada:import re re.compile(r"API|TOKEN|KEY|SECRET|PASS|SIGNATURE|HTTP_COOKIE", flags=re.IGNORECASE)
Changed in Django 4.2:HTTP_COOKIE
was added.
-
is_active
(request)¶ Returns
True
to activate the filtering inget_post_parameters()
andget_traceback_frame_variables()
. By default the filter is active ifDEBUG
isFalse
. Note that sensitiverequest.META
values are always filtered along with sensitive setting values, as described in theDEBUG
documentation.
-
get_post_parameters
(request)¶ Mengembalikan dictionary yang disaring dari parameter POST. Nilai sensitif diganti dengan
cleansed_substitute
.
-
get_traceback_frame_variables
(request, tb_frame)¶ Mengembalikan dictionary yang disaring dari variabel lokal untuk untuk kerangka traceback yang diberikan. Nilai sensitif diganti dengan
cleansed_substitute
.
-
Jika anda butuh menyesuaikan laporan kesalahan melampaui penyaringan anda mungkin menentukan kelas pelapor kesalahan disesuaikan dengan menentukan pengaturan DEFAULT_EXCEPTION_REPORTER
.
DEFAULT_EXCEPTION_REPORTER = "path.to.your.CustomExceptionReporter"
The exception reporter is responsible for compiling the exception report data,
and formatting it as text or HTML appropriately. (The exception reporter uses
DEFAULT_EXCEPTION_REPORTER_FILTER
when preparing the exception
report data.)
Kelas pelapor disesuaikan anda butuh diwarisi dari django.views.debug.ExceptionReporter
.
-
class
ExceptionReporter
¶ -
html_template_path
¶ Property that returns a
pathlib.Path
representing the absolute filesystem path to a template for rendering the HTML representation of the exception. Defaults to the Django provided template.
-
text_template_path
¶ Property that returns a
pathlib.Path
representing the absolute filesystem path to a template for rendering the plain-text representation of the exception. Defaults to the Django provided template.
-
get_traceback_data
()¶ Mengembalikan sebuah dictionary menanggung informasi melacak kembali.
Ini adalah titik ekstensi utama untuk menyesuaikan laporan pengecualian, sebagai contoh:
from django.views.debug import ExceptionReporter class CustomExceptionReporter(ExceptionReporter): def get_traceback_data(self): data = super().get_traceback_data() # ... remove/add something here ... return data
-
get_traceback_html
()¶ Mengembalikan versi HTML dari laporan pengecualian.
Digunakan untuk versi HTML dari pengawakutu halaman kesalahan HTTP 500.
-
get_traceback_text
()¶ Mengembalikan versi teks polis dari laporan pengecualian.
Digunakan untuk versi teks polos dari pengawakutu halaman kesalahan HTTP 500 dan laporan surel.
-
As with the filter class, you may control which exception reporter class to use
within any given view by setting the HttpRequest
’s
exception_reporter_class
attribute:
def my_view(request):
if request.user.is_authenticated:
request.exception_reporter_class = CustomExceptionReporter()
...
Lihat juga
Anda dapat juga mengatur penyesuaian pelaporan kesalahan dengan menulis sebuah potongan penyesuaian dari exception middleware. Jika anda melakukan menulis penyesuaian penanganan kesalahan, adalah ide bagus untuk meniru penanganan kesalahan siap pakai Django dan hanya laporan/catatan kesalahan jika setting:DEBUG adalah False
.