Django - Pourquoi devrais-je utiliser la render_to_response à tous?
considérez ceci:
return render(request, 'index.html', {..context..})
return render_to_response('index.html', {..context..})
D'une part, render
est plus propre et plus pythonic. De l'autre, vous utilisez le request
que votre premier argument que je trouve redondant et confus. J'ai donc commencé à me demander sur les plus grandes différences...
Selon les docs:
render() est la même comme un appel à render_to_response() avec un
context_instance argument que les forces de l'utilisation d'un RequestContext.
Donc, la différence est seulement dans l'utilisation de RequestContext. Donc ce qui est important à propos de RequestContext? Regardons les docs de nouveau:
un Contexte particulier, la classe [...] se comporte légèrement différemment de la
normal django.de modèle.Contexte. La première différence est qu'il prend
un HttpRequest en tant que premier argument.
Ok. Qu'à peine, à tous
La deuxième différence, c'est qu'il remplit automatiquement le contexte
avec un peu de variables, en fonction de votre TEMPLATE_CONTEXT_PROCESSORS
mise en [...] En plus de ces, RequestContext utilise toujours
django.de base.context_processors.csrf [...] c'est délibérément codé en dur
et ne peut pas être désactivé par le TEMPLATE_CONTEXT_PROCESSORS
le réglage.
Donc c'est l'essentiel: faire en sorte que toutes les processeurs fonctionnent correctement, avec un accent sur les csrf. Alors, vraiment, pour revenir à mon premier exemple, ces sont en fait les mêmes:
return render(request, 'index.html', {...})
return render_to_response('index.html', {...}, context_instance=RequestContext(request))
Maintenant, Le deuxième exemple est évidemment bien pire, tout cela semble malheureusement être trop compliqué. Donc ma grande question est Pourquoi utiliser render_to_response
à tous? Pourquoi ne pas déprécier il?
D'autres questions qui viennent à l'esprit:
- N'est-il pas une meilleure façon de faire respecter
RequestContext
par défaut? - Est-il un moyen pour éviter de passer
request
comme argument? C'est terriblement redondant. J'ai trouvé un post de blog montrant comment faire render_to_response en un facile à utiliser décorateur. Ne pouvons-nous pas faire quelque chose de similaire avecrender
? - Est-il pensé à ce problème (si c'est un problème)? Je ne vois rien de cela dans le avenir de la dépréciation de la timeline. Je trouve ça particulièrement déroutant, considérant
render
est venu avec django 1.3 précisément pour résoudre les problèmes avec render_to_response, et que tout le monde est d'accord vous ne devriez pas utiliserrender_to_response
Je sais que cela semble un peu hors-sujet, mais je suis l'espoir d'obtenir des réponses pour expliquer pourquoi render_to_response
est de rester autour et\ou des exemples d'utilisation-cas où l'utilisation render_to_response
auront la préférence sur render
(si il y en a)
Vous devez vous connecter pour publier un commentaire.
La plupart des applications utilisent
render_to_response
puisque c'est la valeur par défaut option recommandée depuis le début et jusqu'à Django 1.3. La raison de la coexistence de deux est historique, la dépréciationrender_to_response
forcera beaucoup de code à réécrire, ce qui n'est pas poli dans les versions mineures. Cependant dans ce django-développeur fil ils disent qu'il serait possible d'inclure dans l'autodérision calendrier pour la 2.0.Voici la citation de Russell Keith-Magee, un de de Django reinhardt, les développeurs du noyau. Keith-Magee, répond à une question posté par Jacob Kaplan-Moss, un autre Django contributer qui soulève la question de la dépréciation
render_to_response
:Et Keith-Magee réponses:
Personne ne discute que autodérision, mais je suppose que la réponse à votre question est: Il n'y a pas de raison technique, c'est juste leur intention de ne pas forcer une mise à jour sur l'ensemble de la base de code en la mineur (au moins n'est pas majeur) communiqué de presse.
Trop longtemps; il n'a pas lu
Lorsque le contexte processeurs sont appliquées
Voyons d'abord comment les méthodes
render_to_response
etrender
sont définis.N'est-il pas une meilleure façon de faire respecter RequestContext par défaut?
Note dans la section
sous-classement Contexte: RequestContext
Du code ci-dessus la méthode
render_to_response
appelle la méthodechargeur.render_to_string
oùcontext_instance
paramètre est coché dans cette ligne.Exemple de Code pour la méthode
render_to_string
Ne pouvons-nous faire simple à utiliser décorateur
render
?Nous pouvons écrire décorateur pour cela, mais votre question est subjective. Si il est facile à utiliser ou pas, c'est difficile à dire. Il dépend beaucoup de la
Est-il un moyen pour éviter de transmettre la demande comme argument?
class RequestContext
est défini dans cette ligne.Exemple de Code pour le
class RequestContext
Dernière question n'a pas besoin d'une réponse, si vous comprenez comment le code-behind de Django fonctionne réellement.
render_to_response
est toujours autour de (quoi? dans le cas où vous souhaitez utiliser un nom réservé par votre contexte processeurs? allons, c'est pas une raison). Je comprends que RequestContext besoins de la demande dans le cadre de son initialisation, mais je ne suis toujours pas entièrement convaincu, il n'y a aucun moyen d'éviter de l'utiliser comme un argument