Kerangka sistem pemeriksaan adalah kumpulan dari pemeriksaan tetap untuk memeriksa kebenaran proyek Django. Dia menemukan masalah umum dan menyediakan petunjuk untuk bagaimana memperbaiki mereka. Kerangka ini dapat diperpanjang sehingga anda dapat dengan mudah menambahkan pemeriksaan anda sendiri.
Untuk rincian bagaimana anda menambahkan pemeriksaan sendiri dan menyatukan mereka ke dalam pemeriksaan sistem Django, lihat System check topic guide.
CheckMessage¶Peringatan dan kesalahan dimunculkan oleh sistem pemeriksaan harus contoh dari CheckMessage. Sebuah instance merangkum kesalahan atau peringatan dapat dilaporkan tunggal. Dia juga menyediakan konteks dan petunjuk yang berlaku pada pesan, dan penciri unik yang digunakan untuk tujuan penyaringan.
Argumen pembangun adalah:
levelDEBUG, INFO, WARNING, ERROR, CRITICAL. Jika tingkatan lebih hebat atau sama dengan ERROR, kemudian Django akan mencegah perintah pengelolaan dari menjalankan. Pesan-pesan dengan tingkatan lebih rendah dari ERROR (yaitu peringatan) dilaporkan ke konsol, tetapi dapat disenyapkan.msghintNone dapat digunakan.obj__str__(). Metode ini digunakan selagi melaporkan semua pesan dan hasilnya mendahului pesan.idapplabel.X001, dimana X adalah satu dari huruf CEWID, menunjukkan kesederhanaan pesan (C for kritis, E untuk kesalahan dan sebagainya). Angka dapat dialokasikan dengan aplikasi, tetapi harus unik dalam aplikasi itu.Ada subkelas-subkelas untuk membuat pesan dengan tingkatan umum lebih mudah. Ketika menggunakan mereka anda dapat megnabaikan argumen level karena dia disisipkan oleh nama kelas.
Sistem pemeriksaan Django diorganisasikan menggunakan etiket berikut:
admin: Memeriksa pernyataan situs admin apapun.caches: Memeriksa penyimpanan konfigurasi terkait.compatibility: Masalah potensial tanda dengan versi ditingkatkan.database: Memeriksa masalah-masalah konfigurasi terkait-basisdata. Pemeriksaan basisdata tidak berjalan secara awal karena mereka melakukan lebih dar analisa kode tetap seperti pemeriksaan biasa lakukan. Mereka hanya berjalan oleh perintah migrate atau jika anda menentukan etiket database ketika memanggil perintah check.models: Memeriksa bidang model, bidang, dan pengertian pengelolaan.security: Memeriksa keamanan konfigurasi terkait.signals: Memeriksa pada pernyataan sinyal dan penangan pendaftaran.staticfiles: Memeriksa konfigurasi django.contrib.staticfiles.templates: Memeriksa cetakan konfigurasi terkait.urls: Memeriksa konfigurasi URL.Beberapa pemeriksaan mungkin didaftarkan dengan banyak etiket.
Peringatan pemeriksaan kesesuaian dari kemungkinan masalah-masalah yang akan muncul setelah meningkatkan Django.
Pemeriksaan berikut memeriksa bahwa pengaturan CACHES anda dengan benar dikonfigurasi:
'default' di pengaturan CACHES.Jika anda sedang menggunakan MySQL, pemeriksaan berikut akan dilakukan:
CharFields unik mempunyai max_length > 255."__".pk adalah kata terpesan yang tidak dapat digunakan sebagai nama bidang.choices harus dapat berulang (misalnya, daftar atau tuple).choices harus dapat berulang mengembalikan tuple (nilai sebenarnya, nama yang dapat dibaca manusia).db_index harus berupa None, True atau False.null=True.validators harus dapat dipanggil.BooleanField tidak menerima nilai null. Pemeriksaan ini muncul sebelum dukungan untuk nilai null telah ditambahkan pada Django 2.1.CharField harus menentukan atribut max_length.max_length harus integer positif.max_length diabaikan ketika digunakan dengan IntegerField.DecimalField harus ditentukan atribut decimal_places.decimal_places harus berupa integer bukan-negatif.DecimalField harus ditentukan atribut max_digits.max_digits harus berupa integer bukan-negatif.max_digits harus lebih besar atau sama dengan decimal_places.FilePathField harus mempunyai salah satu allow_files atau allow_folders disetel ke True.GenericIPAddressField tidak dapat menerima nilai-nilai kosong jika nilai-nilai null tidak diijinkan, sebagai nilai-nilai kosong disimpan sebagai null.auto_now, auto_now_add, dan default saling eksklusif. Hanya satu dari pilihan-pilihan ini mungkin dihadirkan.IPAddressField telah dipindahkan kecuali untuk dukungan dalam riwayat perpindahan.IPAddressField telah diusangkan. Dukung untuk dia (kecuali dalam riwayat perpindahan) akan dipindahkan di Django 1.9. Pemeriksaan ini muncul di Django 1.7 and 1.8.CommaSeparatedIntegerField telah diusangkan. mendukung untk itu (kecuali dalam riwayat perpindahan) akan dipindahkan di Django 2.0. Pemeriksaan ini muncul dalam Django 1.10 dan 1.11.CommaSeparatedIntegerField dipindahkan untuk dukungan dalam riwayat perpindahan.unique bukan argumen sah untuk FileField. Pemeriksaan ini dipindahkan dalam Django 1.11.primary_key bukan argumen sah untuk FileField.upload_to ``FileField``harus berupa jalur bergantung, bukan jalur mutlak.ImageField karena Pillow tidak dipasang.<swappable> bukan dari formulir app_label.app_name.<SETTING> acuan <model>, yang belum dipasang, atau abstrak.<app_label>.<model>.id dapat hanya digunakan sebagai nama bidang jika bidang juga disetel primary_key=True.<field name> dari model induk <model> bentrok dengan bidang <field name> dari model induk <model>.<field name> dari model <model>.<field name> mempunyai nama kolom <column name> yang digunakan oleh bidang lain.index_together harus berupa daftar atau tuple.index_together harus berupa daftar atau tuple.unique_together harus berupa daftar atau tuple.unique_together harus berupa daftar atau tuple.indexes/index_together/unique_together mengacu pada bidang tidak ada````.indexes/index_together/unique_together mengacu pada ManyToManyField <field name>, tetapi ManyToManyField tidak didukung untuk pilihan tersebut.ordering harus berupa tuple atau daftar (bahkan jika anda ingin memesan hanya satu bidang).ordering mengacu pada bidang yang tidak ada ````.indexes/index_together/unique_together mengacu pada bidang <field_name> yaitu bukan lokal ke model <model>.<model> mengandung bidang-bidang model.<field>. Panjang maksimum adalah <maximum length> untuk basisdata <alias>.<M2M field>. Panjang maksimum adalah <maximum length> untuk basisdata <alias>.<model>.check() saat ini dikesampingkan.ordering dan order_with_respect_to tidak dapat digunakan bersama-sama.<function> mengandung acuan lazy pada <app label>.<model>, tetapi aplikasi <app label> tidak dipasang atau tidak menyediakan model <model>.1 tidak dapat mulai atau berakhir dengan sebuah garis bawah ketika itu bertabrakan dengan sintaksis penacrian permintaan.1 tidak dapat mengandung garis bawah ganda ketika itu bertabrakan dengan sintaksis pencarian permintaan.<property name> bertabrakan dengan pengakses bidang terkait.primary_key=True.Pemeriksaan keamanan tidak membuat situs anda aman. Mereka tidak memeriksa kode, melalui pengenalan gangguan, atau melakukan apapun khususnya yang rumit. Tentu saja, mereka membantu melakukan sebuah otomatis, daftar centang yang mudah dijangkau. Mereka membantu anda mengingat hal-hal sederhana yang meningkatkan keamanan situs anda.
Beberapa pemeriksaan ini mungkin tidak sesuai untuk konfigurasi penyebaran tertentu anda. Sebagai contoh, jika anda melakukan pengalihan HTTP ke HTTPS anda dalam sebuah penyeimbang beban, itu akan menjengkelkan terus-menerus diperingati mengenai tidak memiliki SECURE_SSL_REDIRECT diadakan. Gunakan SILENCED_SYSTEM_CHECKS untuk mendiamkan pemeriksaan yang tidak dibutuhkan
Pemeriksaan berikut berjalan jika anda menggunakan pilihan check --deploy:
django.middleware.security.SecurityMiddleware dalam MIDDLEWARE anda sehingga pengaturan SECURE_HSTS_SECONDS, SECURE_CONTENT_TYPE_NOSNIFF, SECURE_BROWSER_XSS_FILTER, dan SECURE_SSL_REDIRECT tidak mempunyai pengaruh.django.middleware.clickjacking.XFrameOptionsMiddleware dalam MIDDLEWARE, sehingga halaman anda tidak akan dilayani dalam sebuah kepala 'x-frame-options'. Meskipun ada alasan bagus untuk situs anda dilayani di sebuah kerangka, anda harus mempertimbangkan mengadakan kepala ini untuk membantu mencegah serangan clickjacking.django.middleware.csrf.CsrfViewMiddleware tidak dalam pengaturan MIDDLEWARE anda). Mengadakan middleware adalah pendekatan teraman untuk memastikan anda tidak meninggalkan celah apapun.SECURE_HSTS_SECONDS. Jika keseluruhan situs anda hanya terhadap SSL, anda mungkin ingin mempertimbangkan pengaturan sebuah nilai dan mengadakan HTTP Strict Transport Security. Pastikan membaca dokumentasi dahulu; mengadakan HSTS tanpa bertanggung jawab dapat menyebabkan serius, masalah tidak dapat diubah.SECURE_HSTS_INCLUDE_SUBDOMAINS menjadi True. Tanpa ini, situs anda berpotensi rentan pada serangan melalui hubungan tidak aman ke subranah. Hanya setel ini menjadi True jika anda yakin bajwa semua subranah dari ranah anda harus dilayani secara khusus melalui SSL.SECURE_CONTENT_TYPE_NOSNIFF anda tidak disetel menjadi True, jadi halaman anda tidak akan dilayani dengan kepala 'x-content-type-options: nosniff'. Anda harus mempertimbangkan mengadakan kepala ini untuk mencegah peramban dari menciri jenis isi secara tidak benar.SECURE_BROWSER_XSS_FILTER anda disetel menjadi True, jadi halaman anda tidak akan dilayani dengan kepala 'x-xss-protection: 1; mode=block'. Anda harus mempertimbangkan mengadakan kepala ini untuk mengaktifkan penyaringan XSS peramban dan membantu mencegah serangan XSS.SECURE_SSL_REDIRECT anda tidak disetel menjadi True. Meskipun situs anda harus tersedia terhadap kedua hubungan SSL dan bukan-SSL, anda mungkin ingin antara menyetel pengaturan ini menjadi True atau konfigurasi sebuah penyeimbang muatan atau peladen membalikkan-proxy ke mengalihkan semua hubungan pada HTTPS.SECRET_KEY anda mempunyai kurang dari 50 karakter atau kurang dari 5 karakter unik. Harap bangkitkan sebuah SECRET_KEY panjang dan acak, jika tidak banyak dari fitur-fitur kritis-keamanan Django akan rentan pada serangan.django.contrib.sessions di INSTALLED_APPS anda tetapi anda belum menyetel SESSION_COOKIE_SECURE menjadi True. Menggunakan kue sesi hanya-aman membuatnya lebih sulit untuk lalu lintas jaringan sapu tangan untuk membajak sesi pengguna.django.contrib.sessions.middleware.SessionMiddleware dalam MIDDLEWARE anda, tetapi anda belum menyetel SESSION_COOKIE_SECURE menjadi True. Menggunakan sesi kue hanya-aman membuatnya lebih sulit untuk pencium lalu lintas jaringan membajak sesi pengguna.SESSION_COOKIE_SECURE tidak disetel menjadi True. Menggunakan kue sesi hanya-aman membuatnya lebih sulit untuk lalu lintas jaringan sapu tangan untuk membajak sesi pengguna.django.contrib.sessions di INSTALLED_APPS anda, tetapi anda belum menyetel SESSION_COOKIE_HTTPONLY menjadi True. Menggunakan kue sesi HttpOnly membuatnya lebih sulit untuk serangan penulisan lintas-situs untuk membajak sesi pengguna.django.contrib.sessions.middleware.SessionMiddleware dalam MIDDLEWARE anda, tetapi anda belum menyetel SESSION_COOKIE_HTTPONLY menjadi True. Menggunakan sebuah sesi kue HttpOnly membuatnya itu lebih sulit untuk serangan cross-site scripting untuk membajaksesi pengguna.SESSION_COOKIE_HTTPONLY tidak disetel menjadi True. Menggunakan kue sesi HttpOnly membuatnya lebih sulit untuk serangan penulisan lintas-situs untuk membajak sesi pengguna.CSRF_COOKIE_SECURE tidak disetel menjadi True. Menggunakan kue CSRF hanya-aman membuatnya lebih sulit untuk lalu lintas jaringan sapu tangan untuk mencuri token CSRF.CSRF_COOKIE_HTTPONLY tidak disetel menjadi True. Menggunakan sebuah kue CSRF HttpOnly membuatnya lebih sulit untuk serangan cross-site scripting untuk mencuri token CSRF Pemeriksaan ini dipindahkan dalam Django 1.11 ketika pengaturan CSRF_COOKIE_HTTPONLY * tidak menawarkan keuntungan berguna.*DEBUG disetel ke True dalam menyebarkan.django.middleware.clickjacking.XFrameOptionsMiddleware dalam MIDDLEWARE anda, tetapi X_FRAME_OPTIONS disetel menjadi 'DENY'. Awalan adalah 'SAMEORIGIN', tetapi meskipun terdapat alasan bagus untuk situs anda melayani bagian lain dari itu sendiri dalam sebuah kerangka, anda harus merubahnya menjadi 'DENY'.ALLOWED_HOSTS harus tidak kosong dalam menyebarkan.SECURE_HSTS_PRELOAD menjadi True. Tanpa ini, situs anda tidak dapat diajukan ke daftar pramuat peramban.<handler> telah terhubung ke sinyal <signal> dengan acuan lazy ke pengirim <app label>.<model>, tetapi aplikasi <app label> tidak terpasang atau tidak menyediakan model <model>.Pemeriksaan berikut dilakukan di konfigurasi URL anda:
<pattern> menggunakan include() dengan route akhiran $. Memindahkan dolar dari route untuk menghindari masalah termasuk URL.<pattern> mempunyai route dimulai dengan sebuah /. Pindahkan garis miring ini ketika itu tidak dibutuhkan. Jika pola ini disasarkan dalam sebuah include(), pastikan pola include() mempunyai buntutan /.<pattern> URL mempunyai name termasuk sebuah :. Pindahkan titik dua, untuk menghindari dua arti acuan namespace.<pattern> tidak sah. Pastikan bahwa urlpatterns adalah daftar dari path() dan/atau contoh re_path().1 tidak unik. Anda mungkin tidak dapat membalikkan semua URL dalam namespace ini.MEDIA_URL/ STATIC_URL harus berakhir dengan sebuah garis miring.contrib¶admin¶Admin memeriksa semua yang dilakukan sebagai bagian dari etiket admin.
Pemeriksaan berikut dilakukan pada setiap ModelAdmin (atau subkelas) yang terdaftar dengan situs admin:
raw_id_fields harus berupa daftar atau tuple.raw_id_fields[n] mengacu pada <field name>, yang bukan sebuah atribut dari <model>.raw_id_fields[n] harus foreign key atau bidang many-to-many.fields harus berupa daftar atau tuple.fieldsets dan fields ditentukan.fields mengandung bidang ganda.fieldsets harus berupa daftar atau tuple.fieldsets[n] harus berupa daftar atau tuple.fieldsets[n] harus panjang 2.fieldsets[n][1] harus berupa kamus.fieldsets[n][1] harus mengandung kunci fields.fieldsets[n][1].fields[n]/fieldsets[n][m] tidak dapat menyertakan <field name> ManyToManyField, karena bidang itu secara manual menentukan sebuah hubungan model.exclude harus berupa daftar atau tuple.exclude mengandung bidang ganda.form harus warisan dari BaseModelForm.filter_vertical harus berupa daftar atau tuple.filter_horizontal harus berupa daftar atau tuple.filter_vertical[n]/filter_vertical[n] mengacu pada <field name>, yang bukan sebuah atribut dari <model>.filter_vertical[n]/filter_vertical[n] harus berupa bidang many-to-many.radio_fields harus berupa kamus.radio_fields mengacu pada <field name>, yang bukan sebuah atribut dari <model>.radio_fields mengacu pada <field name>, yang bukan ForeignKey, dan tidak mempunyai pengertian choices.radio_fields[<field name>] harus berupa admin.HORIZONTAL atau admin.VERTICAL.view_on_site harus berupa callable atau nilai boolean.prepopulated_fields harus berupa kamus.prepopulated_fields mengacu pada <field name>, yang bukan sebuah atribut dari <model>.prepopulated_fields mengacu pada <field name>, yang harus tidak berupa sebuah bidang DateTimeField, ForeignKey, OneToOneField, atau ManyToManyField.prepopulated_fields[<field name>] harus berupa daftar atau tuple.prepopulated_fields mengacu pada <field name>, yang bukan sebuah atribut dari <model>.ordering harus berupa daftar atau tuple.ordering mempunyai pembuat urutan acak ?, tetapi mengandung bidang lain juga.ordering mengacu pada <field name>, yang bukan sebuah atribut dari <model>.readonly_fields harus berupa sebuah daftar atau tuple.readonly_fields[n] adalah tidak callable, sebuah atribut dari <ModelAdmin class>, atau sebuah atribut dari <model>.autocomplete_fields harus berupa list atau tuple.autocomplete_fields[n] mengacu pada <field name>, yang bukan sebuah atribut dari <model>.autocomplete_fields[n] harus berupa sebuah foreign key atau bidang many-to-many.<model> harus didaftarkan untuk diacukan oleh <modeladmin>.autocomplete_fields.<modeladmin> harus menentukan search_fields, karena itu diacukan oleh``<other_modeladmin>.autocomplete_fields``.ModelAdmin¶Pemeriksaan berikut dilakukan di setiap ModelAdmin yang terdaftar dengan situs admin:
save_as harus boolean.save_on_top harus boolean.inlines harus berupa sebuahd daftar atau tuple.<InlineModelAdmin class> harus mewarisi dari InlineModelAdmin.<InlineModelAdmin class> harus mempunyai atribut model.<InlineModelAdmin class>.model harus berupa Model.list_display harus berupa daftar atau tuple.list_display[n] merujuk pada``<label>``, yang merupakan bukan callable, sebuah atribut dari <ModelAdmin class>, atau sebuah atribut atau metode di <model>.list_display[n] harus tidak berupa bidang ManyToManyField.list_display_links harus berupa daftar, tuple atau None.list_display_links[n] mengacu pada <label>, yang tidak ditentukan di list_display.list_filter harus berupa daftar atau tuple.list_filter[n] harus warisan dari ListFilter.list_filter[n] harus bukan warisan dari FieldListFilter.list_filter[n][1] harus warisan dari FieldListFilter.list_filter[n] mengacu pada <label>, yang bukan mengacu pada sebuah Bidang.list_select_related harus berupa boolean, tuple atau daftar.list_per_page harus berupa integer.list_max_show_all harus berupa integer.list_editable harus berupa sebuah daftar atau tuple.list_editable[n] mengacu pada <field label>, yang bukan sebuah atribut dari <model>.list_editable[n] mengacu pada <label>, yang tidak berisi di list_display.list_editable[n] tidak dapat di kedua list_editable dan list_display_links.list_editable[n] mengacu pada bidang pertama di list_display (<label>), yang tidak dapat digunakan meskipun list_display_links disetel.list_editable[n] mengacu pada <field name>, yang tidak dapat disunting melalui admin.search_fields harus berupa sebuah daftar atau tuple.date_hierarchy mengacu pada <field name>, yang tidak mengacu ke sebuah Bidang.date_hierarchy harus berupa DateField atau DateTimeField.<modeladmin> harus menentukan metode has_<foo>_permission() untuk tindakan <action>.InlineModelAdmin¶Pemeriksaan berikut dilakukan pada setiap InlineModelAdmin yang didaftarkan sebagai sebaris pada ModelAdmin.
<field name>, karena itu adalah foreign key pada model induk <app_label>.<model>.<model> tidak mempunyai ForeignKey pada <parent model>./ <model> mempunyai lebih dari satu ForeignKey pada <parent model>.extra harus berupa integer.max_num harus berupa integer.min_num harus berupa integer.formset harus warisan dari BaseModelFormSet.GenericInlineModelAdmin¶Pemeriksaan berikut dilakukan pada setiap GenericInlineModelAdmin yang didaftarkan sebagai berderet pada ModelAdmin.
'ct_field' acuan <label>, yang bukan bidang di <model>.'ct_fk_field' acuan <label>, yang bukan bidang pada <model>.<model> tidak mempunyai GenericForeignKey.<model> tidak mempunyai GenericForeignKey menggunakan <field name> bidang jenis isi dan <field name> bidang ID obyek.AdminSite¶Pemeriksaan berikut dilakukan pada awalan AdminSite:
django.contrib.contenttypes harus di INSTALLED_APPS untuk menggunakan aplikasi admin.django.contrib.auth.context_processors.auth harus di TEMPLATES untuk menggunakan aplikasi admin.auth¶REQUIRED_FIELDS harus berupa daftar atau rekaman.USERNAME_FIELD untuk model pengguna penyesuaian harus tidak disertakan di REQUIRED_FIELDS.<field> harus unik karena itu dinamai sebagai USERNAME_FIELD.<field> dinamai sebagai USERNAME_FIELD, tetapi itu tidak unik.<codename> bentrok dengan perizinan siap pakai untuk model <model>.<codename> digunakan untuk model <model>.verbose_name dari model <model> harus berupa paling banyak 244 karakter untuk nama-nama perizinan siap pakainya menjadi paling banyak 255 karakter.<name> dari model <model> tidak lebih panjang dari 255 karakter.<User model>.is_anonymous harus berupa sebuah atribut atau sifat daripada sebuah metode. Mengabaikan ini adalah masalah keamanan ketika pengguna anonim akan diperlakukan sebagai terotentifikasi!<User model>.is_authenticated harus berupa sebuah atribut atau sifat daripada sebuah metode. Mengabaikan ini adalah masalah keamanan ketika pengguna anonim akan diperlakukan sebagai terotentifikasi!contenttypes¶Pemeriksaan berikut dilakukan ketika sebuah model mengandung sebuah GenericForeignKey atau GenericRelation:
GenericForeignKey mengacu bidang tidak ada <field>.GenericForeignKey mengacu field <field> yang tidak ada.<field> bukan ForeignKey.<field> bukan ForeignKey pada contenttypes.ContentType.postgres¶Pemeriksaan berikut dilakukan pada bidang model django.contrib.postgres:
<field> awalan harus berupa callable daripada instance sehingga itu tidak dibagi diantara semua instance bidang.sites¶Pemeriksaan berikut dilakukan pada setiap model menggunakan CurrentSiteManager:
CurrentSiteManager tidak dapat menemukan sebuah bidang dinamai <field name>.CurrentSiteManager tidak dapat menggunakan <field> karena itu adalah bukan foreign key atau bidang many-to-many.staticfiles¶Pemeriksaan berikut mensahkan bahwa django.contrib.staticfiles dikonfigurasi dengan benar.
STATICFILES_DIRS bukan tuple atau list.STATICFILES_DIRS harus tidak mengandung pengaturan :setting:`STATIC_ROOT.Mar 30, 2019