Jul 23, 2018
Mysql 中默认的 wait_timeout 和 interactive_timeout 的值是八小时,也就是一个连接(交互式和非交互式的)只有在 8 小时没有活动之后才会被关闭掉。对于互联网公司来说,这个值实在太大了,一个库可能被很多脚本和服务访问,可能只是一个简短的查询就不需要数据库了,如果每个查询都占据了8小时的时间,那么 mysql 很快连接数就会满了,报出 too many connections 错误。
mysql 默认的连接数可以修改 max_connections 参数,但是一个服务器能支撑的连接数显然是由硬件决定的。
设置 wait_timeout 过短可能会造成一些问题,如果在 django 中两次查询的之间时间大于 wait_timeout,就会报 (2006, 'MySQL server has gone away')。django 官方给的建议是:
- 当你的脚本不需要使用数据库的时候,主动关闭连接
from django.db …
Jun 17, 2018
和普通的单元测试不同的是,django 单独提供了一个测试模块,所有的 TestCase 需要继承 django.test.TestCase。
简单的测试
from django.test import TestCase
from myapp.models import Animal
class AnimalTestCase(TestCase):
def setUp(self):
Animal.objects.create(name="lion", sound="roar")
Animal.objects.create(name="cat", sound="meow")
def test_animals_can_speak(self):
"""Animals that can speak are correctly identified …
Jun 17, 2018
settings.py 中的设置:
MIDDLEWARE_CLASSES = (
...
'django.middleware.locale.LocaleMiddleware',
)
LANGUAGE_CODE = 'en'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGES = (
('en', ('English')),
('zh-hans', ('中文简体')),
('zh-hant', ('中文繁體')),
)
#翻译文件所在目录,需要手工创建
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
TEMPLATE_CONTEXT_PROCESSORS = (
...
"django.core.context_processors.i18n",
)
生成需要翻译的文件:
python manage.py makemessages -l zh_hans
python manage.py makemessages -l …
Jun 17, 2018
django 作为一个动态的网站系统,在并发访问量大的时候会遇到性能问题,这时候可以使用缓存来显著提高性能。
settings.py 中的配置
可以使用 django-redis 来使用redis作为缓存。
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
配置需要缓存的函数
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 秒数,这里指缓存 15 分钟,不直接写900是为了提高可读性
def index …
Jun 17, 2018
settings.py 中的相关配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static')
一般来说我们只要把静态文件放在 APP 中的 static 目录下,部署时用 python manage.py collectstatic
就可以把静态文件收集到(复制到) STATIC_ROOT 目录,但是有时我们有一些共用的静态文件,这时候可以设置 STATICFILES_DIRS 另外弄一个文件夹,如下:
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "common_static"),
'/var/www/static/',
)
这样我们就可以把静态文件放在 common_static 和 /var/www/static/中了,Django也能找到它们。
MEDIA_URL = '/media/'
MEDIA_ROOT …
Jun 17, 2018
django 使用正则指定路径,然后使用一个函数来处理对应的请求。
定义响应函数
响应函数如下:
# views.py
from django.shortcuts import render
from django.http import HttpResponse
def add(request):
a = request.GET['a']
b = request.GET['b']
c = int(a) + int(b)
return HttpResponse(str(c))
def add2(request, a, b):
c = int(a) + int(b)
return HttpResponse(str …
May 01, 2018
django 中的 form 和 model 的用法很像,都是定义一个类,然后指定一些字段就可以了
最简单的form
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
def clean_message(self):
message = self.cleaned_data['message']
num_words = len(message.split())
if num_words < 4:
raise forms.ValidationError …
Apr 30, 2018
import csv
from django.db.models.loading import get_model
def dump(qs, outfile_path):
"""
Takes in a Django queryset and spits out a CSV file.
Usage::
>> from utils import dump2csv
>> from dummy_app.models import *
>> qs = DummyModel.objects.all()
>> dump2csv.dump(qs, './data/dump.csv')
Based on a snippet by zbyte64::
http …
Jan 17, 2018
激活
django 自带的 auth 模块需要收先创建数据库才能够使用:
python manage.py migrate auth
python manage.py migrate
request.user.is_anonymous 检查用户是否
django comes with login/logout forms and views
from django.conf.urls import url
from django.contrib import admin
from django.contrib.auth import views as auth_views
urlpatterns = [
url(r'^login/$', auth_views …
Nov 13, 2017
marco
there is no marco in django template, you just have to use include with parameters
{% include "marco.html" with arg=parameter %}
variable
{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}
If a variable resolves to a callable, the template system will call it with no arguments and use its result instead …