Django 以及 Wing IDE 时区、语言和编码问题—leopov
Django框架简介

Django框架简介Django是一个使用Python编写的开源Web应用程序框架,它遵循了MTV(模型-模板-视图)的设计模式,能够快速而高效地开发出功能完备的Web应用程序。
一、Django的历史与背景Django最初是在2003年由Adrian Holovaty与Simon Willison开发的,在2005年的夏天,他们决定将其开源,随后成为了Django项目的核心开发团队。
Django能够帮助开发者快速构建高质量的Web应用,并在短时间内获得了广泛的关注和用户基础。
二、Django的特点与优势1. 简单易学:Django提供了清晰简洁的API,对于有Python经验的开发人员来说很容易上手,同时也有详尽的文档和丰富的教程资源。
2. 模块化设计:Django的功能被划分为多个独立的模块,每个模块只负责一项特定的任务,使得应用的各个部分可以被灵活地组合和重用。
3. 自动化:Django提供了许多自动化的工具和功能,如自动生成数据库模型、自动生成管理后台、自动化的表单处理等,极大地提高了开发效率。
4. 安全性:Django内置了多种安全机制,可以防止常见的Web应用攻击,例如跨站脚本攻击(XSS)、SQL注入等。
5. 扩展性:Django支持插件式的开发,可以通过第三方插件来扩展框架的功能,同时也可以与其他Python库或框架进行无缝集成。
三、Django的组成与工作原理1. 模型(Model):负责定义数据模型和数据库操作,通过模型可以轻松地进行数据的增删改查操作。
2. 模板(Template):负责定义用户界面的展示形式,通过模板可以将动态数据呈现给用户。
3. 视图(View):负责处理用户请求并控制应用逻辑,根据用户的请求从模型中读取数据,然后将数据传递给模板进行展示。
4. URL调度器:负责将用户的URL请求映射到相应的视图函数进行处理。
5. 中间件(Middleware):负责在请求和响应过程中执行额外的处理,例如身份验证、请求解析、日志记录等。
Django的timezone应用心得

Django的timezone应用心得展开全文Django的timezone应用心得自从Django1.4开始, django之中就开始使用timezone这个玩意了, 换成中文, 就是时区的意思.中国地区幅员辽阔, 按照15度一个时区计算,中国横跨5个时区, 但是实际上我们使用的是北京时间的东八区时间, 就是在国际标准时间的基础上, 早了8个小时. 也就是说北京这边看到日出了, 8小时后位于英国的国际标准时间起点的位置才能看到日出.django既然开始用这个时区了, 那我们也要跟上啊. 结果就是出现了很多意想不到的错误.#1. 大量的 RuntimeWarning: DateTimeField received a naive datetime (YYYY-MM-DD HH:MM:SS) while time zone support is active这种情况就是你的settings.py中的 USE_TZ=True 了, 一旦你设置了这个地方, 你的噩梦就开始了.哈哈, 如果为了眼不见心不烦, 你可以将它设置为False: USE_TZ = False, 这样, django1.4中出现的timezone你完全不必理会, 还是按照你以前的设置来运行程序.#2. now.date()居然是昨天, 或者明天.实际上, 确实会遇到这种问题.举个实例来说吧:有新闻(news)模块, News model有个字段为 pub_date, 然后, 你设置客户端访问该条新闻的url为 /news/2013/08/23/10086/ 就是按照/新闻/年/月/日/ID/ 的方式编排, 结果你发现: /news/2013/08/23/10086/ 居然是404, 找不到这个新闻, 到数据库中一看, 实际上是存在这条新闻的, 但是为什么就是看不到这个新闻呢?经过看文档和django源码, 我终于找到了原因:先看News model的简单定义:class News(models.Model):title = models.CharField(max_length=200)pub_date = models.DateTimeField('date published',blank=True,default=timezone.now)content = models.TextField()def get_absolute_url(self):return "/news/%s/%d/" % (self.pub_date.strftime("%Y/%m/%d").lower(), self.pk)1. 可以看到, pub_date我已经让它默认使用django的timezone.now函数来获取默认时间了(这个时间是支持timezone的, 这个timezone的值, 就是settings.py中定义的TIME_ZONE = 'Asia/Shanghai' (中国只有2个时区字符串, 一个是上海'Asia/Shanghai', 一个是重庆'Asia/Chongqing', 以前的政府所在地, 千万不要用北京, 这个在国际标准中是不存在的)2. 那么self.pub_date应该是django中的aware_time了, 那么这个self.pub_date 的date 为啥不对, 导致找不到这条新闻呢?原因后来我终于发现了, django 在存储 self.pub_date到数据库的时候, 好像是保存为 UTC 时区的, 也就是说这个self.pub_date和你的服务器项目的settings.py中设置好的时区'Asia/Shanghai' 是不一样的, 也就是说, 最后得到的date可能不是同一天. 所以self.pub_date.strftime("%Y/%m/%d") 获得的日期的表示, 可能不是你的时区的日期, 而是UTC时区的日期这里, 你的时区的日期只的是你的服务器的项目设置里面的时区, 'Asia/Shanghai' ,我设置为这个, 肯定是以服务器时间为准的, 因此, 用户访问新闻/日期/id 的时候, 这个日期不是服务器时区的日期的时候, 会发现出现404错误. 不过因为只有8小时的时差, 这种错误有时候不会出现. 因为差了8小时也可能是同一天. 如果是凌晨1点发的, 差8小时可能就会在日期上相隔一天.因此就出现了错误.那么你肯定要说, 那为什么不以数据库中保存的utc时区来生成url呢, 这样就不会有时区的差别了. 实际上我上面的代码就是这么做的,那么为什么还会在date日期上有差别呢?通过找源码, 我发现了在django\views\generic\dates.py 文件的292行开始的2个函数里class DateMixin(object): 里def _make_date_lookup_arg(self, value):"""Convert a date into a datetime when the date field is a DateTimeField.When time zone support is enabled, date is assumed to be in thecurrent time zone, so that displayed items are consistent with the URL."""if es_datetime_field:value = bine(value, datetime.time.min)if E_TZ:value = timezone.make_aware(value, timezone.get_current_timezone())return valuedef _make_single_date_lookup(self, date):"""Get the lookup kwargs for filtering on a single date.If the date field is a DateTimeField, we can't just filter ondate_field=date because that doesn't take the time into account."""print datedate_field = self.get_date_field()print date_fieldif es_datetime_field:since = self._make_date_lookup_arg(date)until = self._make_date_lookup_arg(date + datetime.timedelta(days=1))print ' since',sinceprint ' until',untilreturn {'%sgte' % date_field: since,'%slt' % date_field: until,}else:# Skip self._make_date_lookup_arg, it's a no-op in this branch.return {date_field: date}注意since 和 until, 也就是BaseDateDetailView中的get_object 最后会调用这2个函数, 实际上BaseDateDetailView 是对新闻/年/月/日/id 进行分解调用, 解析出了请求的url中的年与日, 再组合成 2013-08-23 这样的字符串, 然后在数据库中进行过滤, 取得 2013-08-23 到 2013-08-24 日期之间的所有新闻集, 再在这个新闻集中找具有id的新闻.问题就是since 2013-08-23 00:00:00+08:00until 2013-08-24 00:00:00+08:00这种时间是时区为 asia/shanghai 的, 也就是你的settings.py中设置的时区, 和UTC时区相差了8个小时, 因此将数据库中的UTC时区的日期按照settings.py中设置的时区Asia/Shanghai 来过滤, 结果居然没有这一天的新闻.那么解决的办法就是修改url 中的年月日生成方式, 按照settings.py中设置好的时区, 来生成年月日的url因此, 按照settings.py中设置好的时区, 来更正url中的年月日, 就不会再出现问题了.def get_absolute_url(self):# 获取settings中的时区current_tz = timezone.get_current_timezone()# 按照该时区格式化数据库中存储的UTC时区时间self.pub_date 为 settings中的时区db_local_time = current_tz.normalize(self.pub_date)# 取出date()并生成urlreturn "/news/%s/%d/" % (db_local_time.date().strftime("%Y/%m/%d").lower(), self.pk)来自:/blog/archive/2013/8/23/84/django-timezone-usage-log/。
Django框架开发中的时间日期处理技巧

Django框架开发中的时间日期处理技巧在Django框架的开发过程中,经常会涉及到处理时间和日期的需求。
正确地操作和处理时间日期数据对于应用程序的正确性和可靠性至关重要。
本文将介绍一些在Django框架中处理时间日期的技巧和最佳实践。
一、使用时间和日期字段在Django框架中,我们可以使用DateTimeField或DateField等字段类型来存储时间和日期数据。
DateTimeField存储时间和日期,而DateField仅存储日期。
在定义模型时,我们可以使用这些字段类型来存储相关的时间和日期信息。
例如,我们可以使用DateTimeField来存储文章的发布时间,或使用DateField来存储用户的生日。
二、获取当前时间和日期在编写应用程序时,可能需要获取当前的时间和日期。
Django框架提供了一个函数`datetime.now()`来获取当前的时间和日期。
这个函数返回一个datetime对象,我们可以通过调用其属性来获取具体的时间和日期值。
例如,以下代码展示了如何获取当前的时间和日期:```pythonfrom datetime import datetimecurrent_time = datetime.now()print("当前时间:", current_time.strftime("%Y-%m-%d %H:%M:%S")) print("当前日期:", current_time.strftime("%Y-%m-%d"))```三、格式化时间和日期在Django框架中,我们可以使用strftime方法来格式化时间和日期。
strftime方法可以将datetime对象格式化为指定的字符串。
在格式化字符串中,我们可以使用各种占位符来表示不同的时间和日期部分。
例如,"%Y"代表年份,"%m"代表月份,"%d"代表日期,"%H"代表小时,"%M"代表分钟,"%S"代表秒钟。
Django中的代码调试与错误追踪技巧

Django中的代码调试与错误追踪技巧在Django开发过程中,调试代码和追踪错误是常见的任务。
本文将介绍一些在Django中进行代码调试和错误追踪的技巧,并提供一些常用的调试工具和方法。
1. 使用日志记录工具在Django中,使用日志记录工具是一种常用的调试方法。
可以使用Python内置的logging模块来记录日志信息。
通过在代码中插入日志语句,可以追踪代码执行过程中的变量值、函数调用、异常信息等。
以下是一个简单的示例:```pythonimport logging# 创建日志记录器logger = logging.getLogger(__name__)def my_function():logger.debug('开始执行my_function')# ...logger.debug('执行某些操作')# ...logger.error('发生错误')# ...```在Django的配置文件中,可以设置日志记录器的级别和输出方式,以便更好地追踪问题并分析错误信息。
2. 使用Django内置的调试工具Django提供了一些内置的调试工具,可以帮助开发者追踪代码中的错误。
其中包括:- Django的错误页面:当应用程序发生错误时,Django会自动显示错误页面,并提供详细的错误信息和代码追踪信息。
通过查看错误页面,可以快速定位错误发生的位置和原因。
- 开发期间的调试服务器:在进行Django开发时,可以使用调试服务器来运行应用程序。
调试服务器会显示详细的请求和响应信息,包括请求的URL、请求的方法、请求的参数等。
通过查看调试服务器的输出,可以更好地了解应用程序的运行情况。
3. 使用断点进行代码调试在开发过程中,可以通过在代码中设置断点的方式来调试代码。
断点就是一个程序中暂停执行的位置,可以在该位置检查和修改变量的值,并逐步执行代码来追踪问题。
在Django中,可以使用pdb模块或调试器(如PyCharm、VS Code等)来设置和使用断点。
Django面试题(附带答案)

Django⾯试题(附带答案)总结的⼀些Django中会问的问题,希望对你们有⽤。
1、 Django的⽣命周期当⽤户在浏览器输⼊url时,浏览器会⽣成请求头和请求体发送给服务端,url经过Django中的wsgi时请求对象创建完成,经过django的中间件,然后到路由系统匹配路由,匹配成功后⾛到相对应的views函数,视图函数执⾏相关的逻辑代码返回执⾏结果,Django把客户端想要的数据作为⼀个字符串返回给客户端,客户端接收数据,渲染到页⾯展现给⽤户2、内置组件Admin、from、modelfrom、model3、缓存⽅案设置缓存到内存缓存到redis,配置redisCACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://39.96.61.39:6379",'PASSWORD':'19990104.Yu',"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}}}单个view缓存视图导⼊from django.views.decorators.cache import cache_page在需要进⾏缓存的视图函数上添加如下装饰器即可:@cache_page(60 * 2)#20分钟底层缓存API视图导⼊ from django.core.cache import cache模板⽚段缓存使⽤cache标签进⾏缓存在HTML⽂件中添加:{%load cache%}{%cache 60 缓存名字 %}4、 FBV和CBVFBV:基于函数的视图函数CBV:基于类的视图函数5、 session和cookie区别:cookie数据存放在客户的浏览器上,session数据放在服务器上cookie不是很安全,别⼈可以分析存放在本地的COOKIE并进⾏COOKIE欺骗考虑到安全应当使⽤session。
Django国际化与本地化实现多语言支持与地区适配

Django国际化与本地化实现多语言支持与地区适配Django是一个流行的Python Web框架,提供了强大的国际化(Internationalization)与本地化(Localization)支持,使得开发者可以轻松地实现多语言支持与地区适配。
本文将介绍Django中的国际化与本地化实现方法,以及如何配置和使用这些功能。
一、概述在全球化的今天,开发一个支持多语言和地区的应用已经变得越来越重要。
Django通过其内置的国际化与本地化功能,为开发者提供了一种简单而强大的方式来处理不同语言和地区的需求,为用户提供更好的体验。
二、配置在Django中,开启国际化与本地化非常简单。
首先,在项目的settings.py文件中,将`USE_I18N`和`USE_L10N`两个配置项设置为True,以启用国际化和本地化功能。
同时,设置`LANGUAGE_CODE`为应用程序的默认语言,并在`LANGUAGES`中定义支持的语言列表。
三、翻译文件为了实现多语言支持,Django使用翻译文件(translation files)来存储各种语言的翻译文本。
翻译文件采用gettext格式,使用.po文件扩展名。
对于每个支持的语言,需要创建对应的翻译文件。
可以使用Django 提供的`makemessages`命令自动生成翻译文件,该命令会扫描项目中的源代码,并根据其中的翻译函数提取待翻译的文本。
开发者只需要翻译这些文本,然后使用`compilemessages`命令编译翻译文件。
四、翻译函数在Django中,使用`gettext`函数来标记待翻译的文本。
`gettext`函数接受一个字符串作为参数,并返回其翻译结果。
为了方便,Django提供了一系列的快捷函数,如`gettext`、`pgettext`、`npgettext`等,用于不同的上下文和复数形式等特殊情况。
开发者可以在模板文件、Python代码中使用这些翻译函数,将不同语言的翻译文本包装在函数中,以便国际化处理。
PythonDjangoMySQL,时区、日期、时间戳(USE_TZ=True时的时间存储问题)
PythonDjangoMySQL,时区、⽇期、时间戳(USE_TZ=True时的时间存储问题)Python Django MySQL,时区、⽇期、时间戳,写下这个标题的时候,头脑⾥⾯回荡着⽕车上的经典⼴告词:啤酒、饮料、矿泉⽔,花⽣、⽠⼦、⼋宝粥。
当然本⽂跟这些零⾷吃喝没有关系,我们主要来聊聊时间问题。
环境说明:1、约定:本⽂中的“时间”,如未特别说明均指“⽇期+时间”,即形如“%Y-%m-%d %H:%M:%S”,或“yyyy-mm-dd HH:MM:SS” 等包含⽇期和时间点的值,可能包含形如 “.fraction” 的毫秒级的数值以及时区标识。
2、软件版本:Python:2.7.10Django:1.11.12 finalMySQL:5.7.183、基础数据:Django Model:class IcsServiceStatusModel(models.Model):class Meta:db_table = 'ics_service_status'app_label = 'ics_meta'objects = SelfDefinedManager()id = models.AutoField(primary_key=True)pub_id = models.CharField(max_length=15)service_mode = models.SmallIntegerField(max_length=5)current_session = models.CharField(max_length=50)last_msg_dt = models.DateTimeField()created_at = models.DateTimeField()updated_at = models.DateTimeField()MySQL 数据表:CREATE TABLE IF NOT EXISTS `ics_service_status` (`id` int(20) UNSIGNED NOT NULL AUTO_INCREMENT,`pub_id` varchar(15) NOT NULL,`service_mode` tinyint(5) NOT NULL,`current_session` varchar(50) NOT NULL,`last_msg_dt` datetime NOT NULL,`created_at` datetime NOT NULL,`updated_at` datetime NOT NULL,PRIMARY KEY(`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='智能客服服务状态跟踪表' $$知识点⼀、计算机上的时间表⽰1、时间的常规表⽰时间通常分为⽇期和时刻,表⽰为 y 年 m ⽉ d ⽇ H 时 M 分S 秒。
Django中的异常处理与错误调试技巧
Django中的异常处理与错误调试技巧Django是一种流行的Python Web框架,用于快速开发可扩展的Web应用程序。
在开发过程中,我们经常会遇到各种异常和错误,而良好的异常处理和错误调试技巧是保证应用程序稳定性和可靠性的关键因素。
本文将介绍一些在Django中处理异常和调试错误的技巧和最佳实践。
一、异常处理1.1 数据库异常处理在Django中,数据库操作过程中可能会出现各种异常,如数据库连接错误、查询结果为空等。
为了提高应用程序的容错能力和用户体验,我们应该编写相应的异常处理代码。
以下是一些常见的数据库异常处理技巧:1. 捕获数据库连接错误try:# 数据库操作except DatabaseError as e:# 处理数据库连接错误,如记录日志、返回友好错误信息等2. 处理查询结果为空result = MyModel.objects.filter(<条件>)if result.exists():# 处理非空查询结果else:# 处理空查询结果1.2 视图函数异常处理视图函数是Django中处理HTTP请求的核心组件,因此异常处理在视图函数中尤为重要。
以下是一些处理视图函数异常的技巧:1. 使用try-except捕获视图函数异常def my_view(request):try:# 视图函数逻辑except Exception as e:# 处理异常,如记录日志、返回友好错误页面等2. 使用Django内置的装饰器处理常见异常from django.views.decorators.csrf import csrf_exempt@csrf_exemptdef my_view(request):# 视图函数逻辑1.3 自定义异常和错误页面在Django中,我们可以自定义异常和错误页面,以提供更好的用户体验。
1. 自定义异常类class CustomException(Exception):pass# 抛出自定义异常raise CustomException("自定义异常信息")2. 自定义错误页面在Django设置文件(settings.py)中,配置错误页面的路径:handler404 = 'myapp.views.page_not_found'handler500 = 'myapp.views.server_error'def page_not_found(request, exception):return render(request, '404.html')def server_error(request):return render(request, '500.html')二、错误调试技巧2.1 设置DEBUG模式在Django的配置文件中,设置DEBUG模式为True,可以开启详细的错误信息显示,方便开发调试。
Django中实现多语言支持与切换的方法
Django中实现多语言支持与切换的方法对于开发多语言网站或应用程序来说,提供多语言支持和切换功能是至关重要的。
Django作为一个强大的Python Web框架,提供了多种方法来实现多语言的支持与切换。
本文将介绍几种实现多语言支持与切换的方法,并提供相应的代码示例和步骤。
1. 设置语言支持在Django中,首先需要设置语言支持。
打开settings.py文件,找到LANGUAGE_CODE选项,将其设置为默认语言,例如:LANGUAGE_CODE = 'en-us'接下来,在settings.py文件内添加以下代码,以启用多语言支持:LANGUAGES = [('en', 'English'),('zh-hans', '简体中文'),('zh-hant', '繁體中文'),]这些代码将定义支持的语言列表,以及相应的语言码和显示名称。
2. 定义翻译文件Django使用翻译文件来实现多语言支持。
每个应用程序都可以拥有自己的翻译文件。
在每个应用程序的根目录下,创建一个名为"locale"的文件夹。
然后,在该文件夹下再创建两个子文件夹,分别用于不同语言的翻译文件。
以英文和中文为例,创建以下结构的文件夹:myapp├── locale│ ├── en│ │ └── LC_MESSAGES│ │ └── django.po│ └── zh-hans│ └── LC_MESSAGES│ └── django.po在django.po文件中,可以使用gettext等工具编写翻译文本,例如:msgid "Hello, World!"msgstr "你好,世界!"3. 编译翻译文件在编写完翻译文本后,需要将其编译为二进制文件,以供Django使用。
Django模板语言(常用语法规则)
Django模板语⾔(常⽤语法规则)Django模板语⾔ The Django template language模板中常⽤的语法规则{最新版本的Django语法可能有改变,不⽀持的操作可能⽀持了。
[]}Django变量VariablesA variable outputs a value from the context, which is a dict-like objectmapping keys to values.Variables are surrounded by {{ and}} like this:My first name is {{ first_name }}. My last name is {{ last_name }}.With a context of {'first_name':'John','last_name': 'Doe'}Django 模板标签if/else 标签1. 基本语法格式如下:{% if condition %}... display{% endif %}或者:{% if condition1 %}... display 1{% elif condiiton2 %}... display 2{% else %}... display 3{% endif %}根据条件判断是否输出。
if/else ⽀持嵌套。
Note:模板标签中的变量是不⽤{{}}包含的。
2. {% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断,或者对变量取反( not ),例如:{% if athlete_list and coach_list %}athletes 和 coaches 变量都是可⽤的。
{% endif %}Note:1. {% if %}标签不允许在同⼀个标签中同时使⽤and和or,因为逻辑上可能模糊的,这样的代码是不合法的:{% if athlete_list and coach_list or cheerleader_list %}2. 系统不⽀持⽤圆括号来组合⽐较操作。