Django 1.10 release notes¶
1 augusti 2016
Välkommen till Django 1.10!
Dessa release notes täcker de nya funktionerna, samt några bakåtkompatibla ändringar som du vill vara medveten om när du uppgraderar från Django 1.9 eller äldre versioner. Vi har ta bort några funktioner som har nått slutet av sin utfasningscykel, och vi har startat utfasningsprocessen för några funktioner.
Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.
Kompatibilitet med Python¶
Liksom Django 1.9 kräver Django 1.10 Python 2.7, 3.4 eller 3.5. Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.
Vad är nytt i Django 1.10¶
Fulltextsökning efter PostgreSQL¶
django.contrib.postgres
innehåller nu en :doc:``samling av databasfunktioner </ref/contrib/postgres/search>` för att möjliggöra användning av fulltextsökmotorn. Du kan söka över flera fält i din relationsdatabas, kombinera sökningarna med andra uppslagningar, använda olika språkkonfigurationer och viktningar samt rangordna resultaten efter relevans.
Det innehåller nu också stöd för trigram, med hjälp av trigram_similar
lookup och uttrycken TrigramSimilarity
och TrigramDistance
.
Ny typ av middleware¶
En ny typ av mellanprogram introduceras för att lösa bristen på strikt request/response-skiktning i den gamla typen av mellanprogram som beskrivs i `DEP 0005 <https://github.com/django/deps/blob/main/final/0005-improved-middleware.rst>`_. Du måste anpassa gamla, anpassade mellanprogram och byta från inställningen MIDDLEWARE_CLASSES
till den nya MIDDLEWARE
-inställningen för att dra nytta av förbättringarna.
Officiellt stöd för Unicode-användarnamn¶
Modellen User
i django.contrib.auth
accepterade ursprungligen endast ASCII-bokstäver och siffror i användarnamn. Även om det inte var ett medvetet val har Unicode-tecken alltid accepterats när Python 3 används.
Användarnamnsvalidatorn accepterar nu uttryckligen Unicode-tecken som standard endast i Python 3.
Anpassade användarmodeller kan använda den nya ASCIIUsernameValidator
eller UnicodeUsernameValidator
.
Mindre funktioner¶
django.contrib.admin
¶
För webbplatser som körs på en underväg kommer standard
URL för länken "Visa webbplats"
högst upp på varje administratörssida nu att peka pårequest.META['SCRIPT_NAME']
om den är inställd, istället för/
.Det framgångsmeddelande som visas när du har lagt till eller redigerat ett objekt innehåller nu en länk till objektets ändringsformulär.
All inline JavaScript tas bort så att du kan aktivera HTTP-huvudet ”Content-Security-Policy” om du vill.
Det nya attributet
InlineModelAdmin.classes
gör det möjligt att ange klasser på inline-fältuppsättningar. Inlines med encollapse
-klass kommer initialt att vara kollapsade och deras rubrik kommer att ha en liten ”show”-länk.Om en användare inte har behörighet att lägga till kommer blocket
object-tools
på en modells ändringslista nu att återges (utan knappen för att lägga till). Detta gör det enklare att lägga till anpassade verktyg i det här fallet.Modellen
LogEntry
lagrar nu ändringsmeddelanden i en JSON-struktur så att meddelandet kan översättas dynamiskt med hjälp av det aktuella aktiva språket. En ny metodLogEntry.get_change_message()
är nu det föredragna sättet att hämta ändringsmeddelandet.Valda objekt för fält i
ModelAdmin.raw_id_fields
har nu en länk till objektets ändringsformulär.Lagt till alternativen ”No date” och ”Has date” för
DateFieldListFilter
om fältet är nullable.JQuery-biblioteket som är inbäddat i administratören har uppgraderats från version 2.1.4 till 2.2.3.
django.contrib.auth
¶
Lagt till stöd för Argon2 lösenordshash. Det rekommenderas framför PBKDF2, men det är inte standard eftersom det kräver ett tredjepartsbibliotek.
Standardantalet iterationer för PBKDF2-lösenordshasher har ökats med 25%. Denna bakåtkompatibla ändring kommer inte att påverka användare som har underklassat
django.contrib.auth.hashers.PBKDF2PasswordHasher
för att ändra standardvärdet.Vyn
django.contrib.auth.views.logout()
skickar ”no-cache”-rubriker för att förhindra ett problem där Safari cachar omdirigeringar och hindrar en användare från att kunna logga ut.Lade till det valfria
backend
-argumentet tilldjango.contrib.auth.login()
för att tillåta användning utan inloggningsuppgifter.Den nya
LOGOUT_REDIRECT_URL
-inställningen styr omdirigeringen av vyndjango.contrib.auth.views.logout()
, om vyn inte får ettnext_page
-argument.Den nya parametern
redirect_authenticated_user
för vyndjango.contrib.auth.views.login()
gör det möjligt att omdirigera autentiserade användare som besöker inloggningssidan.De nya
AllowAllUsersModelBackend
ochAllowAllUsersRemoteUserBackend
ignorerar värdet avUser.is_active
, medanModelBackend
ochRemoteUserBackend
nu avvisar inaktiva användare.
django.contrib.gis
¶
Distance lookups accepterar nu uttryck som parametern för avståndsvärdet.
Den nya egenskapen
GEOSGeometry.unary_union
beräknar föreningen av alla element i denna geometri.Lade till
GEOSGeometry.covers()
binärt predikat.Lade till metoden
GDALBand.statistics()
och attributenmean
ochstd
.Lagt till stöd för
MakeLine
-aggregatet ochGeoHash
-funktionen på SpatiaLite.Lagt till stöd för funktionerna
Difference
,Intersection
ochSymDifference
på MySQL.Stöd för instansiering av tomma GEOS-geometrier har lagts till.
De nya egenskaperna
trim
ochprecision
iWKTWriter
gör det möjligt att styra utmatningen av bråkdelen av koordinaterna i WKT.Lagt till egenskaperna
LineString.closed
ochMultiLineString.closed
.Serien GeoJSON serializer matar nu ut primärnyckeln för objekt i ordlistan
properties
om specifika fält inte anges.Möjligheten att replikera indata på metoden
GDALBand.data()
lades till. Banddata kan nu uppdateras med upprepade värden på ett effektivt sätt.Lagt till databasfunktionerna
IsValid
ochMakeValid
, samtisvalid
lookup, alla för PostGIS. Detta gör det möjligt att filtrera och reparera ogiltiga geometrier på databassidan.Lagt till rasterstöd för alla spatiala uppslagningar.
django.contrib.postgres
¶
För enkelhetens skull kastar
HStoreField
nu sina nycklar och värden till strängar.
django.contrib.sessions
¶
Hanteringskommandot
clearsessions
tar nu bort filbaserade sessioner.
django.contrib.sites
¶
django.contrib.staticfiles
¶
Malltaggen
static
använder nudjango.contrib.staticfiles
om den finns iINSTALLED_APPS
. Detta är särskilt användbart för tredjepartsappar som nu alltid kan använda{% load static %}
(istället för{% load staticfiles %}
eller{% load static from staticfiles %}
) och inte oroa sig för om appenstaticfiles
är installerad eller inte.Du kan :ref:
enklare anpassa <customize-staticfiles-ignore-patterns>
alternativetcollectstatic --ignore
med en anpassadAppConfig
.
Cache¶
Den filbaserade cache-backend använder nu det högsta picklingprotokollet.
CSRF¶
Standardinställningen :CSRF_FAILURE_VIEW,
views.csrf.csrf_failure()
accepterar nu en valfri parametertemplate_name
, med standardvärdet'403_csrf.html'
, för att styra den mall som används för att rendera sidan.För att skydda mot BREACH-attacker ändrar CSRF-skyddsmekanismen nu värdet på formulärets token vid varje förfrågan (samtidigt som den behåller en oföränderlig hemlighet som kan användas för att validera de olika tokens).
Databas backends¶
Subtraktion av temporär data var enhetlig på alla backends.
Om databasen stöder det kan backends ställa in
DatabaseFeatures.can_return_ids_from_bulk_insert=True
och implementeraDatabaseOperations.fetch_returned_insert_ids()
för att ställa in primärnycklar på objekt som skapats medQuerySet.bulk_create()
.Lade till nyckelordsargument till
as_sql()
-metoderna för olika uttryck (Func
,When
,Case
ochOrderBy
) för att tillåta databasbackends att anpassa dem utan att muteraself
, vilket inte är säkert när man använder olika databasbackends. Se parametrarnaarg_joiner
och**extra_context
iFunc.as_sql()
för ett exempel.
Fil delning¶
Lagringsbackends presenterar nu ett tidszonsmedvetet API med nya metoder
get_accessed_time()
,get_created_time()
ochget_modified_time()
. De returnerar en tidszonsmedvetendatatid
omUSE_TZ
ärTrue
och en naivdatatid
i den lokala tidszonen annars.Den nya
Storage.generate_filename()
-metoden gör det enklare att implementera anpassade lagringsenheter som inte använderos.path
-anropen som tidigare fanns iFileField
.
Formulär¶
Formuläret och widgeten
Media
används nu meddjango.contrib.staticfiles
om det är installerat.Taggen
<input>
som återges avCharField
innehåller nu ett attributminlength
om fältet har enmin_length
.Obligatoriska formulärfält har nu HTML-attributet
required
. Ställ in det nya attributetForm.use_required_attribute
tillFalse
för att inaktivera det. Attributetrequired
ingår inte i formulär för formuläruppsättningar eftersom webbläsarens validering kanske inte är korrekt när du lägger till och tar bort formuläruppsättningar.
Generiska åsikter¶
Klassen
View
kan nu importeras fråndjango.views
.
Internationalisering¶
Hjälpfunktionen
i18n_patterns()
kan nu användas i en rot-URLConf som anges medrequest.urlconf
.Genom att ställa in den nya parametern
prefix_default_language
föri18n_patterns()
tillFalse
kan du tillåta åtkomst till standardspråket utan ett URL-prefix.set_language()
returnerar nu en 204 statuskod (Inget innehåll) för AJAX-förfrågningar när det inte finns någonnext
parameter iPOST
ellerGET
.De klassbaserade vyerna
JavaScriptCatalog
ochJSONCatalog
ersätter de föråldrade funktionsbaserade vyernajavascript_catalog()
ochjson_catalog()
. De nya vyerna är nästan likvärdiga med de gamla förutom att de nya vyerna som standard samlar in alla JavaScript-strängar i översättningsdomänendjangojs
från alla installerade appar istället för bara JavaScript-strängarna frånLOCALE_PATHS
.
Kommandon för hantering¶
call_command()
returnerar nu det värde som returneras från metodencommand.handle()
.Det nya alternativet
check --fail-level
gör det möjligt att ange den meddelandenivå som gör att kommandot avslutas med en status som inte är noll.Det nya alternativet
makemigrations --check
gör att kommandot avslutas med en status som inte är noll när modelländringar utan migreringar upptäcks.makemigrations
visar nu sökvägen till de migreringsfiler som den genererar.Alternativet
shell --interface
accepterar nupython
för att tvinga fram användning av den ”vanliga” Python-tolken.Med det nya alternativet
shell --command
kan du köra ett kommando som Django och avsluta, istället för att öppna det interaktiva skalet.Lade till en varning till
dumpdata
om en proxymodell anges (vilket resulterar i ingen utdata) utan dess konkreta förälder.Det nya attributet
BaseCommand.requires_migrations_checks
kan ställas in påTrue
om du vill att ditt kommando ska skriva ut en varning, somrunserver
gör, om uppsättningen av migreringar på disken inte matchar migreringarna i databasen.För att underlätta testning accepterar
call_command()
nu ett kommando-objekt som det första argumentet.Kommandot
shell
stöder tabbkomplettering på system som använderlibedit
, t.ex. macOS.Med kommandot
inspectdb
kan du välja vilka tabeller som ska inspekteras genom att ange deras namn som argument.
Migreringar¶
Lagt till stöd för serialisering av
enum.Enum
-objekt.Lade till argumentet
elidable
till operationernaRunSQL
ochRunPython
för att tillåta att de tas bort när migreringar krossas.Lagt till stöd för :ref:
non-atomic migrations <non-atomic-migrations>
genom att ställa in attributetatomic
på enMigration
.Kommandona
migrate
ochmakemigrations
har nu check for a consistent migration history. Om de hittar några otillämpade beroenden av en tillämpad migrering, uppstårInconsistentMigrationHistory
.Signalerna
pre_migrate()
ochpost_migrate()
skickar nu sina migreringarplan
ochapps
.
Modeller¶
Omvända utländska nycklar från proxymodeller sprids nu till deras konkreta klass. Den omvända relationen som bifogas av en
ForeignKey
som pekar på en proxymodell är nu tillgänglig som en deskriptor på proxymodellklassen och kan refereras till i queryset-filtrering.Den nya
Field.rel_db_type()
-metoden returnerar databaskolumnens datatyp för fält somForeignKey
ochOneToOneField
som pekar på ett annat fält.Klassattributet
arity
läggs till iFunc
. Detta attribut kan användas för att ställa in antalet argument som funktionen accepterar.Lade till
BigAutoField
som fungerar ungefär som enAutoField
förutom att den garanterat passar siffror från1
till9223372036854775807
.QuerySet.in_bulk()
kan anropas utan några argument för att returnera alla objekt i queryset.related_query_name
stöder nu appetikett och klassinterpolering med hjälp av strängarna'%(app_label)s'
och'%(class)s'
.Tillåter åsidosättande av modellfält som ärvts från abstrakta basklasser.
Funktionen
prefetch_related_objects()
är nu ett offentligt API.QuerySet.bulk_create() <django.db.models.query.QuerySet.bulk_create>`()
ställer in primärnyckeln på objekt när PostgreSQL används.Lagt till databasfunktionen
Cast
.En proxymodell kan nu ärva flera proxymodeller som delar en gemensam icke-abstrakt föräldraklass.
Lagt till
Extract
-funktioner för att extrahera datetime-komponenter som heltal, t.ex. år och timme.Lagt till
Trunc
-funktioner för att trunkera ett datum eller en datatid till en betydande komponent. De möjliggör frågor som försäljning per dag eller försäljning per timme.Model.__init__()
anger nu värden för virtuella fält från dess nyckelordsargument.De nya alternativen
Meta.base_manager_name
ochMeta.default_manager_name
gör det möjligt att styra_base_manager
respektive_default_manager
.
Förfrågningar och svar¶
Lade till
request.user
i felsökningsvyn.Lagt till
HttpResponse
-metodernareadable()
ochseekable()
för att göra en instans till ett strömliknande objekt och tillåta inpackning medio.TextIOWrapper
.Lagt till attributen
HttpRequest.content_type
ochcontent_params
som tolkas från rubrikenCONTENT_TYPE
.Parsern för
request.COOKIES
har förenklats för att bättre matcha webbläsarnas beteende.request.COOKIES
kan nu innehålla cookies som är ogiltiga enligt :rfc:`6265`` men som är möjliga att ställa in viadocument.cookie
.
Serialisering¶
django.core.serializers.json.DjangoJSONEncoder
vet nu hur man serialiserar lata strängar, som vanligtvis används för översättningsbart innehåll.
Mallar¶
Lade till alternativet
autoescape
tillDjangoTemplates
-backend ochEngine
-klassen.Lade till jämförelseoperatorerna
is
ochis not
till taggenif
.Tillåter
dictsort
att ordna en lista med listor efter ett element vid ett angivet index.Kontextprocessorn
debug()
innehåller frågor för alla databasalias i stället för bara standardaliaset.Lagt till stöd för relativa sökvägar för strängargument i malltaggarna
extends
ochinclude
.
Tester¶
För att bättre fånga upp buggar kontrollerar
TestCase
nu deferrable databasbegränsningar i slutet av varje test.Tester och testfall kan märkas med taggar och köras selektivt med de nya alternativen
test --tag
ochtest --exclude-tag
.Du kan nu logga in och använda sessioner med testklienten även om
django.contrib.sessions
inte finns iINSTALLED_APPS
.
URL:er¶
Ett tillägg i
django.setup()
gör att URL-resolving som sker utanför request/response-cykeln (t.ex. i hanteringskommandon och fristående skript) kan ta hänsyn tillFORCE_SCRIPT_NAME
när den ställs in.
Validerare¶
URLValidator
begränsar nu längden på domännamnsetiketter till 63 tecken och den totala längden på domännamn till 253 tecken enligt RFC 1034.int_list_validator()
accepterar nu en valfri boolesk parameterallow_negative
, med standardvärdetFalse
, för att tillåta negativa heltal.
Bakåtkompatibla ändringar i 1.10¶
Varning
Utöver de ändringar som beskrivs i det här avsnittet bör du granska Funktioner borttagna i 1.10 för de funktioner som har nått slutet av sin föråldringscykel och därför har tagits bort. Om du inte har uppdaterat din kod inom utfasningscykeln för en viss funktion kan borttagningen av den framstå som en bakåtkompatibel ändring.
Databas backend API¶
GIS:s
AreaField
använder en ospecificerad underliggande numerisk typ som i praktiken kan vara vilken numerisk Python-typ som helst.decimal.Decimal
-värden som hämtas från databasen konverteras nu tillfloat
för att göra det lättare att kombinera dem med värden som används av GIS-biblioteken.För att aktivera temporal subtraktion måste du ställa in databasfunktionsflaggan
`supports_temporal_subtraction
tillTrue
och implementera metodenDatabaseOperations.subtract_temporals()
. Denna metod ska returnera den SQL och de parametrar som krävs för att beräkna skillnaden i mikrosekunder mellan argumentenlhs
ochrhs
i den datatyp som används för att lagraDurationField
.
_meta.get_fields()
returnerar konsekventa omvända fält för proxymodeller¶
Före Django 1.10 returnerade metoden get_fields()
olika omvända fält när den anropades på en proxymodell jämfört med dess proxybetonade klass. Denna inkonsekvens åtgärdades genom att returnera den fullständiga uppsättningen fält som pekar på en konkret klass eller en av dess proxyer i båda fallen.
AbstractUser.username
max_length
ökad till 150¶
En migrering för django.contrib.auth.models.User.username
ingår. Om du har en anpassad användarmodell som ärver från AbstractUser
måste du generera och tillämpa en databasmigrering för din användarmodell.
Vi övervägde en ökning till 254 tecken för att lättare tillåta användning av e-postadresser (som är begränsade till 254 tecken) som användarnamn men avvisade det på grund av en MySQL-begränsning. När du använder kodningen utf8mb4
(rekommenderas för korrekt Unicode-stöd) kan MySQL endast skapa unika index med 191 tecken som standard. Om du behöver en längre längd ska du därför använda en anpassad användarmodell.
Om du vill behålla gränsen på 30 tecken för användarnamn ska du använda ett anpassat formulär när du skapar en användare eller ändrar användarnamn:
from django.contrib.auth.forms import UserCreationForm
class MyUserCreationForm(UserCreationForm):
username = forms.CharField(
max_length=30,
help_text="Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.",
)
Om du vill behålla denna begränsning i administratören, ställ in UserAdmin.add_form
för att använda detta formulär:
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
class UserAdmin(BaseUserAdmin):
add_form = MyUserCreationForm
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
Slopat stöd för PostgreSQL 9.1¶
Uppströmsstöd för PostgreSQL 9.1 slutar i september 2016. Som en följd av detta ställer Django 1.10 PostgreSQL 9.2 som den minsta version som den officiellt stöder.
runserver
utdata går genom loggning¶
Hantering av begäran och svar för kommandot runserver
skickas till loggern django-server-logger` istället för till sys.stderr
. Om du inaktiverar Djangos loggningskonfiguration eller åsidosätter den med din egen, måste du lägga till lämplig loggningskonfiguration om du vill se den utdata:
LOGGING = {
# ...
"formatters": {
"django.server": {
"()": "django.utils.log.ServerFormatter",
"format": "[%(server_time)s] %(message)s",
}
},
"handlers": {
"django.server": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "django.server",
},
},
"loggers": {
"django.server": {
"handlers": ["django.server"],
"level": "INFO",
"propagate": False,
}
},
}
testmodellerna auth.CustomUser
och auth.ExtensionUser
har tagits bort¶
Sedan införandet av migreringar för Contrib-apparna i Django 1.8 skapades inte tabellerna för dessa anpassade användartestmodeller längre, vilket gör dem oanvändbara i ett testsammanhang.
Apps-registret fylls inte längre i automatiskt när man plockar upp modeller utanför Django¶
Appregistret fylls inte längre i automatiskt när man plockar bort modeller. Detta lades till i Django 1.7.2 som ett försök att tillåta uppplockning av modeller utanför Django, till exempel i en RQ-arbetare, utan att anropa django.setup()
, men det skapar en möjlighet till ett dödläge. För att anpassa din kod i fallet med RQ kan du ”tillhandahålla ditt eget arbetsskript <https://python-rq.org/docs/workers/>`_ som anropar django.setup()
.
Borttagen kontroll av null-tilldelning för icke-null-fält i främmande nycklar¶
I äldre versioner gav tilldelning av None
till en icke-nullbar ForeignKey
eller OneToOneField
upphov till ValueError('Cannot assign None: "model.field" does not allow null values.')
. För att vara konsekvent med andra modellfält som inte har en liknande kontroll tas denna kontroll bort.
Svaga lösenordshashers har tagits bort från standardinställningen PASSWORD_HASHERS
¶
Django 0.90 lagrade lösenord som osaltad MD5. Django 0.91 lade till stöd för saltad SHA1 med automatisk uppgradering av lösenord när en användare loggar in. Django 1.4 lade till PBKDF2 som standardlösenordshasher.
Om du har ett gammalt Django-projekt med MD5- eller SHA1-kodade (även saltade) lösenord, var medveten om att dessa kan knäckas ganska enkelt med dagens hårdvara. För att få Django-användare att erkänna fortsatt användning av svaga hashrar, tas följande hashrar bort från standardinställningen PASSWORD_HASHERS
:
"django.contrib.auth.hashers.SHA1PasswordHasher"`
"django.contrib.auth.hashers.MD5PasswordHasher"`
"django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher"
"django.contrib.auth.hashers.UnsaltedMD5PasswordHasher"
"django.contrib.auth.hashers.CryptPasswordHasher"`
Överväg att använda en wrapped password hasher för att stärka hasharna i din databas. Om det inte är möjligt, lägg till inställningen PASSWORD_HASHERS
i ditt projekt och lägg till de hashare som du behöver.
Du kan kontrollera om din databas innehåller någon av de borttagna hasharna så här:
from django.contrib.auth import get_user_model
User = get_user_model()
# Unsalted MD5/SHA1:
User.objects.filter(password__startswith="md5$$")
User.objects.filter(password__startswith="sha1$$")
# Salted MD5/SHA1:
User.objects.filter(password__startswith="md5$").exclude(password__startswith="md5$$")
User.objects.filter(password__startswith="sha1$").exclude(password__startswith="sha1$$")
# Crypt hasher:
User.objects.filter(password__startswith="crypt$$")
from django.db.models import CharField
from django.db.models.functions import Length
CharField.register_lookup(Length)
# Unsalted MD5 passwords might not have an 'md5$$' prefix:
User.objects.filter(password__length=32)
metoderna Field.get_prep_lookup()
och Field.get_db_prep_lookup()
har tagits bort¶
Om du har ett anpassat fält som implementerar någon av dessa metoder registrerar du en anpassad lookup för det. Till exempel:
from django.db.models import Field
from django.db.models.lookups import Exact
class MyField(Field): ...
class MyFieldExact(Exact):
def get_prep_lookup(self):
# do_custom_stuff_for_myfield
...
MyField.register_lookup(MyFieldExact)
django.contrib.gis
¶
Stöd för SpatiaLite < 3.0 och GEOS < 3.3 har tagits bort.
Det bakåtkompatibla aliaset
add_postgis_srs()
fördjango.contrib.gis.utils.add_srs_entry()
har tagits bort.I Oracle/GIS returnerar aggregatfunktionen
Area
nu enfloat
istället fördecimal.Decimal
. (Det är fortfarande förpackat i ett mått på kvadratmeter.)Standard
GEOSGeometry
representation (WKT-utdata) är trimmad som standard. Det vill säga, istället förPOINT (23.0000000000000000 5.5000000000000000)
, får duPOINT (23 5.5)
.
Maximal storlek på en request body och antalet GET/POST-parametrar är begränsade¶
Två nya inställningar hjälper till att mildra överbelastningsattacker via stora förfrågningar:
DATA_UPLOAD_MAX_MEMORY_SIZE
begränsar hur stor en begäran får vara. Filuppladdningar räknas inte in i denna gräns.DATA_UPLOAD_MAX_NUMBER_FIELDS
begränsar antalet GET/POST-parametrar som analyseras.
Program som tar emot ovanligt stora formulärposter kan behöva justera dessa inställningar.
Diverse¶
repr()
av enQuerySet
är omsluten av<QuerySet >
för att skilja den från en vanlig lista vid felsökning.utils.version.get_version()
returnerar PEP 440-kompatibla releasekandidatversioner (t.ex. ’1.10rc1’ istället för ’1.10c1’).CSRF-tokenvärden måste nu vara strängar med 64 alfanumeriska tecken; värden med 32 alfanumeriska tecken, som ställs in av äldre versioner av Django som standard, ersätts automatiskt av strängar med 64 tecken. Andra värden betraktas som ogiltiga. Detta bör endast påverka utvecklare eller användare som ersätter dessa tokens.
Inställningen
LOGOUT_URL
tas bort eftersom Django inte har använt den sedan pre-1.0. Om du använder det i ditt projekt kan du lägga till det i projektets inställningar. Standardvärdet var'/accounts/logout/'
.Objekt med en
close()
-metod, t.ex. filer och generatorer som skickas tillHttpResponse
, stängs nu omedelbart istället för när WSGI-servern anroparclose()
på svaret.Ett överflödigt anrop till
transaction.atomic()
iQuerySet.update_or_create()
har tagits bort. Detta kan påverka antalet frågor som testas avTransactionTestCase.assertNumQueries()
.Stöd för
skip_validation
iBaseCommand.execute(**options)
har tagits bort. Användskip_checks
(tillagd i Django 1.7) istället.loaddata
ger nu upphov till ettCommandError
istället för att visa en varning när den angivna fixture-filen inte hittas.Istället för att direkt komma åt attributet
LogEntry.change_message
är det nu bättre att anropa metodenLogEntry.get_change_message()
som kommer att ge meddelandet på det aktuella språket.Standardfelvyerna ger nu upphov till
TemplateDoesNotExist
om ett icke-existerandetemplate_name
anges.Det oanvända nyckelordsargumentet
choices
iSelect
ochSelectMultiple
widgetsrender()
metod har tagits bort. Argumentetchoices
i metodenrender_options()
tas också bort, vilket görselected_choices
till det första argumentet.Tester som bryter mot deferrable databasbegränsningar kommer nu att misslyckas när de körs på en databas som stöder deferrable begränsningar.
Inbyggda hanteringskommandon använder nu indexering av nycklar i
options
, t.ex.options['verbosity']
, istället föroptions.get()
och utför inte längre någon typ tvång. Detta kan vara ett problem om du anropar kommandon med hjälp avCommand.execute()
(som kringgår argumentparsern som anger ett standardvärde) istället förcall_command()
. Istället för att anropaCommand.execute()
, skicka kommando-objektet som det första argumentet tillcall_command()
.ModelBackend
ochRemoteUserBackend
avvisar nu inaktiva användare. Detta innebär att inaktiva användare inte kan logga in och kommer att loggas ut om de byts frånis_active=True
tillFalse
. Om du behöver det tidigare beteendet, använd den nyaAllowAllUsersModelBackend
ellerAllowAllUsersRemoteUserBackend
iAUTHENTICATION_BACKENDS
istället.Mot bakgrund av den tidigare ändringen avvisar testklientens
login()
-metod inte längre alltid inaktiva användare utan delegerar istället detta beslut till autentiseringsbackend.force_login()
delegerar också beslutet till autentiseringsbackend, så om du använder standardbackend måste du använda en aktiv användare.django.views.i18n.set_language()
kan nu returnera en 204-statuskod för AJAX-förfrågningar.Attributet
base_field
iRangeField
är nu en typ av fält, inte en instans av ett fält. Om du har skapat en anpassad underklass avRangeField
, bör du ändra attributetbase_field
.Middleware-klasser initieras nu när servern startar i stället för vid den första förfrågan.
Om du åsidosätter
is_authenticated()
elleris_anonymous()
i en anpassad användarmodell måste du konvertera dem till attribut eller egenskaper enligt beskrivningen i the deprecation note.När du använder
ModelAdmin.save_as=True
, omdirigeras knappen ”Spara som ny” nu till ändringsvyn för det nya objektet istället för till modellens ändringslista. Om du behöver det tidigare beteendet, ställ in det nya attributetModelAdmin.save_as_continue
tillFalse
.Obligatoriska formulärfält har nu HTML-attributet
required
. Ställ inForm.use_required_attribute
attributet tillFalse
för att inaktivera det. Du kan också lägga till attributetnovalidate
till<form>
om du inte vill ha webbläsarvalidering. För att inaktivera attributetrequired
på anpassade widgets, åsidosättWidget.use_required_attribute()
-metoden.WSGI-hanteraren tar inte längre bort innehållet i svar från
HEAD
-förfrågningar eller svar med enstatus_code
på 100-199, 204 eller 304. De flesta webbservrar implementerar redan detta beteende. Svar som hämtas med hjälp av Django-testklienten fortsätter att ha dessa ”svarskorrigeringar” tillämpade.Model.__init__()
tar nu emotdjango.db.models.DEFERRED
som värde för uppskjutna fält.Attributet
Model._deferred
tas bort för dynamiska modellklasser när man använderQuerySet.defer()
ochonly()
tas bort.Storage.save() <django.core.files.storage.Storage.save>`()
ersätter inte längre'\'
med'/'
. Detta beteende flyttas tillFileSystemStorage
eftersom detta är en lagringsspecifik implementationsdetalj. Alla Windows-användare med en anpassad lagringsimplementering som förlitar sig på detta beteende måste implementera det i den anpassade lagringenssave()
-metod.Privata
FileField
-metodernaget_directory_name()
ochget_filename()
anropas inte längre (och är nu föråldrade) vilket är en bakåtkompatibel ändring för användare som åsidosätter dessa metoder på anpassade fält. För att anpassa sådan kod, åsidosättFileField.generate_filename()
ellerStorage.generate_filename()
istället. Det kan vara möjligt att användaupload_to
också.Ämnet i mail som skickas av
AdminEmailHandler
trunkeras inte längre till 989 tecken. Om du räknade med en begränsad längd kan du trunkera ämnet själv.Privata uttryck
django.db.models.expressions.Date
ochDateTime
tas bort. De nyaTrunc
uttrycken ger samma funktionalitet.Attributen
_base_manager
och_default_manager
tas bort från modellinstanser. De förblir tillgängliga för modellklassen.Om du öppnar ett borttaget fält i en modellinstans, t.ex. efter
del obj.field
, laddas fältets värde om istället för att skapaAttributeError
.Om du underklassar
AbstractBaseUser
och åsidosätterclean()
, se till att den anroparsuper()
.AbstractBaseUser.normalize_username()
anropas i en nyAbstractBaseUser.clean()
metod.Privat API
django.forms.models.model_to_dict()
returnerar en queryset istället för en lista med primärnycklar förManyToManyField
.Om
django.contrib.staticfiles
är installerat, använderstatic
mall-taggenstaticfiles
-lagringen för att konstruera URL:en istället för att bara sammanfoga värdet medSTATIC_ROOT
. Det nya tillvägagångssättet kodar URL:en, vilket kan vara bakåtkompatibelt i fall som att inkludera ett fragment i en sökväg, t.ex.{% static 'img.svg#fragment' %}
, eftersom#
kodas som%23
. För att anpassa dig, flytta fragmentet utanför malltaggen:{% static 'img.svg' %}#fragment
.När
USE_L10N
ärTrue
tillämpas nu lokalisering för filtrendate
ochtime
när ingen formatsträng anges. AngivelsernaDATE_FORMAT
ochTIME_FORMAT
från den aktiva språkdräkten används istället för inställningarna med samma namn.
Funktioner som inte längre är aktuella i 1.10¶
Direkt tilldelning till en omvänd främmande nyckel eller många-till-många-relation¶
Istället för att tilldela relaterade objekt med hjälp av direkt tilldelning:
>>> new_list = [obj1, obj2, obj3]
>>> e.related_set = new_list
Använd metoden set()
som lagts till i Django 1.9:
>>> e.related_set.set([obj1, obj2, obj3])
Detta förhindrar förvirring om att en tilldelning resulterar i en implicit sparning.
Inte tidszonmedveten :klass:`~django.core.files.storage.Storage` API¶
De gamla metoderna accessed_time()
, created_time()
och modified_time()
, som inte är tidszonmedvetna, har utgått till förmån för de nya metoderna get_*_time()
.
Tredjeparts lagringsbackends bör implementera de nya metoderna och markera de gamla som föråldrade. Fram till dess konverterar de nya get_*_time()
-metoderna på basen Storage
-klassen datetime
från de gamla metoderna efter behov och avger en varning för föråldring när de gör det.
Tredjeparts lagringsbackends kan behålla de gamla metoderna så länge de vill stödja tidigare versioner av Django.
django.contrib.gis
¶
Metoderna
get_srid()
ochset_srid()
iGEOSGeometry
är avförda till förmån för egenskapensrid
.Metoderna
get_x()
,set_x()
,get_y()
,set_y()
,get_z()
ochset_z()
iPoint
är avförda till förmån för egenskapernax
,y
ochz
.Metoderna
get_coords()
ochset_coords()
förPoint
är avförda till förmån för egenskapentuple
.Egenskapen
cascaded_union
iMultiPolygon
är avskriven till förmån för egenskapenunary_union
.Funktionen
django.contrib.gis.utils.precision_wkt()
är föråldrad till förmån förWKTWriter
.
KommaSepareradIntegerField
modellfält¶
CommaSeparatedIntegerField
är föråldrad till förmån för CharField
med validate_comma_separated_integer_list()
validator:
from django.core.validators import validate_comma_separated_integer_list
from django.db import models
class MyModel(models.Model):
numbers = models.CharField(..., validators=[validate_comma_separated_integer_list])
Om du använder Oracle använder CharField
en annan typ av databasfält (NVARCHAR2
) än CommaSeparatedIntegerField
(VARCHAR2
). Beroende på dina databasinställningar kan detta innebära en annan kodning och därmed en annan längd (i byte) för samma innehåll. Om dina lagrade värden är längre än gränsen på 4000 byte för NVARCHAR2
bör du använda TextField
(NCLOB
) istället. Om du i det här fallet har frågor som grupperar efter fältet (t.ex. genom att kommentera modellen med en aggregering eller använda distinct()
) måste du ändra dem (så att fältet skjuts upp).
__search
fråga uppslagning¶
Lookupen search
, som endast stöder MySQL och har extremt begränsade funktioner, är utdaterad. Ersätt den med en anpassad uppslagning:
from django.db import models
class Search(models.Lookup):
lookup_name = "search"
def as_mysql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return "MATCH (%s) AGAINST (%s IN BOOLEAN MODE)" % (lhs, rhs), params
models.CharField.register_lookup(Search)
models.TextField.register_lookup(Search)
Använda User.is_authenticated()
och User.is_anonymous()
som metoder¶
Metoderna is_authenticated()
och is_anonymous()
i klasserna AbstractBaseUser
och AnonymousUser
är nu egenskaper. De kommer fortfarande att fungera som metoder fram till Django 2.0, men all användning i Django använder nu attributåtkomst.
Om du till exempel använder AuthenticationMiddleware
och vill veta om användaren för närvarande är inloggad skulle du använda:
if request.user.is_authenticated:
... # Do something for logged-in users.
else:
... # Do something for anonymous users.
istället för request.user.is_authenticated()
.
Denna ändring undviker oavsiktligt informationsläckage om du glömmer att anropa metoden, t.ex.:
if request.user.is_authenticated:
return sensitive_information
Om du åsidosätter dessa metoder i en anpassad användarmodell måste du ändra dem till egenskaper eller attribut.
Django använder ett CallableBool
-objekt för att låta dessa attribut fungera som både en egenskap och en metod. Således kan du inte jämföra dessa egenskaper med hjälp av operatören is
förrän deprecation-perioden slutar. Det vill säga att följande inte fungerar:
if request.user.is_authenticated is True:
...
”escape”-delen av django.utils.safestring
¶
Funktionen mark_for_escaping()
och de klasser den använder: EscapeData
, EscapeBytes
, EscapeText
, EscapeString
och EscapeUnicode
är föråldrade.
Som ett resultat är det ”lata” beteendet hos escape
-filtret (där det alltid skulle tillämpas som det sista filtret oavsett var i filterkedjan det dök upp) föråldrat. Filtret kommer att ändras till att omedelbart tillämpa conditional_escape()
i Django 2.0.
Diverse¶
Alternativet
makemigrations --exit
är utdaterat till förmån för alternativetmakemigrations --check
.django.utils.functional.allow_lazy()
är utfasad till förmån för den nyakeep_lazy()
-funktionen som kan användas med en mer naturlig dekoratorsyntax.Alternativet
shell --plain
är föråldrat till förmån för-i python
eller--interface python
.Import från modulen
django.core.urlresolvers
är utfasad till förmån för dess nya plats,django.urls
.Mallmetoden
Context.has_key()
är utfasad till förmån förin
.Det privata attributet
virtual_fields
iModel._meta
är utfasat till förmån förprivate_fields
.De privata nyckelordsargumenten
virtual_only
iField.contribute_to_class()
ochvirtual
iModel._meta.add_field()
är föråldrade till förmån förprivate_only
respektiveprivate
.Vyerna
javascript_catalog()
ochjson_catalog()
är utfasade till förmån för de klassbaserade vyernaJavaScriptCatalog
ochJSONCatalog
.I arv med flera tabeller är implicit marknadsföring av ett
OneToOneField
till enparent_link
föråldrad. Lägg tillparent_link=True
till sådana fält.Det privata API:et
Widget._format_value()
görs offentligt och byter namn tillformat_value()
. Det gamla namnet kommer att fungera genom en avskrivningsperiod.De privata metoderna
FileField
get_directory_name()
ochget_filename()
är avförda till förmån för att utföra detta arbete iStorage.generate_filename()
).Gammaldags middleware som använder
settings.MIDDLEWARE_CLASSES
är föråldrad. Anpassa gammal, anpassad middleware och använd den nya inställningenMIDDLEWARE
.
Funktioner borttagna i 1.10¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 1.10. Se Funktioner som inte längre är aktuella i 1.8 för detaljer, inklusive hur man tar bort användningen av dessa funktioner.
Stöd för att anropa en
SQLCompiler
direkt som ett alias för att anropa dessquote_name_unless_alias
-metod tas bort.Malltaggarna
cycle
ochfirstof
tas bort från malltaggbiblioteketfuture
.django.conf.urls.patterns()
har tagits bort.Stöd för argumentet
prefix
tilldjango.conf.urls.i18n.i18n_patterns()
har tagits bort.SimpleTestCase.urls
tas bort.Om man använder ett felaktigt antal uppackade värden i
for
-malltaggen uppstår ett undantag i stället för att misslyckas tyst.Möjligheten att
reverse()
URL:er som använder en prickad Python-sökväg har tagits bort.Möjligheten att använda en prickad Python-sökväg för inställningarna
LOGIN_URL
ochLOGIN_REDIRECT_URL
har tagits bort.Stöd för
optparse
tas bort för anpassade hanteringskommandon.Klassen
django.core.management.NoArgsCommand
har tagits bort.modulen
django.core.context_processors
har tagits bort.modulen
django.db.models.sql.aggregates
har tagits bort.modulen
django.contrib.gis.db.models.sql.aggregates
har tagits bort.Följande metoder och egenskaper för
django.db.sql.query.Query
tas bort:Egenskaper:
aggregat
ochaggregat_select
Metoder:
add_aggregate
,set_aggregate_mask
ochappend_aggregate_mask
.
django.template.resolve_variable
tas bort.Följande privata API:er har tagits bort från
django.db.models.options.Options
(Model._meta
):get_field_by_name()
get_all_field_names()
get_fields_with_model()
get_konkreta_fält_med_modell()`
get_m2m_med_modell()`
get_all_related_objects()
get_all_related_objects_with_model()
get_all_related_many_to_many_objects()
get_all_related_m2m_objects_with_model()
Argumentet
error_message
idjango.forms.RegexField
har tagits bort.Filtret
unordered_list
stöder inte längre listor i gammal stil.Stöd för sträng-”view”-argument till
url()
har tagits bort.Den bakåtkompatibla shim för att byta namn på
django.forms.Form._has_changed()
tillhas_changed()
tas bort.Mallfiltret
removetags
tas bort.Funktionerna
remove_tags()
ochstrip_entities()
idjango.utils.html
tas bort.Argumentet
is_admin_site
tilldjango.contrib.auth.views.password_reset()
har tagits bort.django.db.models.field.subclassing.SubfieldBase
tas bort.django.utils.checksums
är borttagen.Attributet
original_content_type_id
pådjango.contrib.admin.helpers.InlineAdminForm
är borttaget.Den bakåtkompatibla shim som tillåter att
FormMixin.get_form()
definieras utan något standardvärde för dessform_class
-argument har tagits bort.Följande inställningar tas bort och du måste uppgradera till inställningen
TEMPLATES
:TILLÅTET_INKLUDERA_RÖTTER
TEMPLATE_KONTEXT_PROCESSORER
TEMPLATE_DEBUG
TEMPLATE_DIRS
TEMPLATE_LADDARE
TEMPLATE_STRING_IF_INVALID
Det bakåtkompatibla aliaset
django.template.loader.BaseLoader
tas bort.Django-mallobjekt som returneras av
get_template()
ochselect_template()
accepterar inte längre enContext
i sinrender()
-metod.Template response APIs genomdriva användningen av
dict
och backend-beroende mallobjekt istället förContext
respektiveTemplate
.Parametern
current_app
för följande funktioner och klasser har tagits bort:django.shortcuts.render()
django.template.Context()
django.template.RequestContext()`
django.template.response.TemplateResponse()
``
Parametrarna
dictionary
ochcontext_instance
för följande funktioner har tagits bort:django.shortcuts.render()
django.shortcuts.render_to_response()
django.template.loader.render_to_string()
Parametern
dirs
för följande funktioner har tagits bort:django.template.loader.get_template()
django.template.loader.select_template()
django.shortcuts.render()
django.shortcuts.render_to_response()
Sessionsverifiering är aktiverad oavsett om
'django.contrib.auth.middleware.SessionAuthenticationMiddleware'
finns iMIDDLEWARE_CLASSES
eller inte.SessionAuthenticationMiddleware
har inte längre något syfte och kan tas bort frånMIDDLEWARE_CLASSES
. Det behålls som en stubbe fram till Django 2.0 som en artighet för användare som inte läser den här noten.Det privata attributet
django.db.models.Field.related
har tagits bort.Alternativet
--list
i hanteringskommandotmigrate
har tagits bort.Malltaggen
ssi
har tagits bort.Stöd för jämförelseoperatorn
=
i malltaggenif
har tagits bort.De shims för bakåtkompatibilitet som tillåter att
Storage.get_available_name()
ochStorage.save()
definieras utan ettmax_length
-argument har tagits bort.Stöd för den äldre syntaxen
%(<foo>)s
iModelFormMixin.success_url
har tagits bort.aggregatmetoderna
GeoQuerySet
collect()
,extent()
,extent3d()
,make_line()
ochunionagg()
har tagits bort.Möjligheten att ange
ContentType.name
när man skapar en innehållstypsinstans har tagits bort.Stöd för den gamla signaturen
allow_migrate
har tagits bort.Stöd för syntaxen för
{% cycle %}
som använder kommaseparerade argument har tagits bort.Varningen som
Signer
utfärdade när den fick en ogiltig separator är nu ettValueError
.