- Web Development with Django Cookbook(Second Edition)
- Aidas Bendoraitis
- 480字
- 2021-07-23 14:31:57
Making your code compatible with both Python 2.7 and Python 3
Since version 1.7, Django can be used with Python 2.7 and Python 3. In this recipe, we will take a look at the operations to make your code compatible with both the Python versions.
Getting ready
When creating a new Django project or upgrading an old existing project, consider following the rules given in this recipe.
How to do it…
Making your code compatible with both Python versions consists of the following steps:
- At the top of each module, add
from
__future__ import unicode_literals
and then use usual quotes without au
prefix for Unicode strings and ab
prefix for bytestrings. - To ensure that a value is bytestring, use the
django.utils.encoding.smart_bytes
function. To ensure that a value is Unicode, use thedjango.utils.encoding.smart_text
ordjango.utils.encoding.force_text
function. - For your models, instead of the
__unicode__
method, use the__str__
method and add thepython_2_unicode_compatible
decorator, as follows:# models.py # -*- coding: UTF-8 -*- from __future__ import unicode_literals from django.db import models from django.utils.translation import ugettext_lazy as _ from django.utils.encoding import \ python_2_unicode_compatible @python_2_unicode_compatible class NewsArticle(models.Model): title = models.CharField(_("Title"), max_length=200) content = models.TextField(_("Content")) def __str__(self): return self.title class Meta: verbose_name = _("News Article") verbose_name_plural = _("News Articles")
- To iterate through dictionaries, use
iteritems()
,iterkeys()
, anditervalues()
fromdjango.utils.six
. Take a look at the following:from django.utils.six import iteritems d = {"imported": 25, "skipped": 12, "deleted": 3} for k, v in iteritems(d): print("{0}: {1}".format(k, v))
- When you capture exceptions, use the
as
keyword, as follows:try: article = NewsArticle.objects.get(slug="hello-world") except NewsArticle.DoesNotExist as exc: pass except NewsArticle.MultipleObjectsReturned as exc: pass
- To check the type of a value, use
django.utils.six
, as shown in the following:from django.utils import six isinstance(val, six.string_types) # previously basestring isinstance(val, six.text_type) # previously unicode isinstance(val, bytes) # previously str isinstance(val, six.integer_types) # previously (int, long)
- Instead of
xrange
, userange
fromdjango.utils.six.moves
, as follows:from django.utils.six.moves import range for i in range(1, 11): print(i)
- To check whether the current version is Python 2 or Python 3, you can use the following conditions:
from django.utils import six if six.PY2: print("This is Python 2") if six.PY3: print("This is Python 3")
How it works…
All strings in Django projects should be considered as Unicode strings. Only the input of HttpRequest
and output of HttpResponse
is usually in the UTF-8 encoded bytestring.
Many functions and methods in Python 3 now return the iterators instead of lists, which make the language more efficient. To make the code compatible with both the Python versions, you can use the six library that is bundled in Django.
Read more about writing compatible code in the official Django documentation at https://docs.djangoproject.com/en/1.8/topics/python3/.
Tip
Downloading the example code
You can download the example code files for all Packt books that you have purchased from your account at register in order to have the files e-mailed directly to you.
- 微服務設計(第2版)
- Node.js+Webpack開發(fā)實戰(zhàn)
- 零基礎PHP學習筆記
- arc42 by Example
- PaaS程序設計
- Learn Programming in Python with Cody Jackson
- Instant Ext.NET Application Development
- 深入理解Android:Wi-Fi、NFC和GPS卷
- Mastering Python Design Patterns
- 軟件測試綜合技術
- 算法設計與分析:基于C++編程語言的描述
- Apache Solr for Indexing Data
- Learning iOS Penetration Testing
- Java Web入門很輕松(微課超值版)
- 第五空間戰(zhàn)略:大國間的網(wǎng)絡博弈