r'''
使用之前必备:
求助BIF>>> print(__builtins__) help(__builtins__)
查看BIF内建函数>>> dir(__builtins__);
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
查看关键字>>> help("keywords");
Here is a list of the Python keywords. Enter any keyword to get more help.
False def if raise
None del import return
True elif in try
and else is while
as except lambda with
assert finally nonlocal yield
break for not
class from or
continue global pass
库路径>>>
import sys
print sys.path
sys.stdin sys.stdout sys.stderr
查看安装了模块信息>>>
pydoc modules
help("modules")
sys.modules.keys()
sudo apt-get install python-pip easy_install
pip install yolk
yolk -l #列出所有安装模块
yolk -a #列出激活的模块
yolk -n #列出非激活模块
yolk -U [packagename] # 通过查询pypi来查看(该)模块是否有新版本
查看源码实现>>>
help(module);
/usr/lib/python3.4/
setup.py>>>
from distutils.core import setup
setup(
name = 'nester',
version = '1.0.2',
py_modules = ['nester'],
author = 'zjm',
author_email = 'zoujm@163.com',
url = 'http://www.baidu.com',
description = 'dkfjs',
)
编译安装python3 setup.py sdist(build)
sudo python3 setup.py install
自定义模块的删除: #python3 setup.py install --record record.log记录安装后文件的路径
#cat record.log | sudo xargs rm -rf 删除这些文件
上传到pypi中心>>>python3 setup.py sdist upload
模块的删除:pip uninstall xxxx
使用方法import *; *.fun();
Python 3中有六个标准的数据类型:
Numbers(数字): int、float、bool、complex
String(字符串):' " 1、反斜杠可以用来转义,使用r可以让反斜杠不发生转义。2、字符串可以用+运算符连接在一起,用*运算符重复。3、Python中的字符串有两种索引方式,从左往右以0开始,从右往左以-1开始。4、Python中的字符串不能改变。
List(列表):[ , , ] 1、List写在方括号之间,元素用逗号隔开。2、和字符串一样,list可以被索引和切片。3、List可以使用+操作符进行拼接。4、List中的元素是可以改变的。
Tuple(元组):( , , ) 元组(tuple)与列表类似,不同之处在于元组的元素不能修改 1、与字符串一样,元组的元素不能修改。2、元组也可以被索引和切片,方法一样。3、注意构造包含0或1个元素的元组的特殊语法规则。4、元组也可以使用+操作符进行拼接。
Sets(集合):{, ,}
Dictionaries(字典):{key1=val1, } 1、字典是一种映射类型,它的元素是键值对。2、字典的关键字必须为不可变类型,且不能重复。3、创建空字典使用{ }。
0. raise : cause exception.
suite
1. 空list>>>
movies = [];
movies = list();
num = enumerate();
i = int();
id(movies);
next();
range([start,] stop [,step]);
2. list操作>>>
movies.insert(1, 1975);
movies.append(1999);
movies.remove(2001);
movies.extend(new_movies);
len(movies);
3. 打印list>>>
print(movies, end='', file=fn);
print_lol(movies);
import sys;
def print_lol(alist, indent=False, level=0, fn=sys.stdout):
for each_item in alist:
if isinstance(each_item, list) :
print_lol(each_item, indent,level+1, fn)
else:
if indent:
for stop_tab in range(level):
print("\t", end='', file=fn)
print(each_item, file=fn)
4. file>>>
tfile = open("filename", "r | w | w+ |b")/tfile.close()
with open(fn, 'wb') as tfile: 多个使用“,”分割,使用了上下文管理协议(context management protocol)的python技术
try/except/finally
line_spoken.find(':');
(role, line_spoken) = echo_line.split(':', 1);
line_spoken.strip();
os.path.exists('filename');
readline();
seek();
not
pass ==> null;
5. error>>>
except IOError as err:
print('The file is missing.' + str(err));
if 'tfile' in locals(): // 当前域中的变量集合 globals()返回全局作用域的属性字典, locals()返回局部作用域的属性字典.
except pickle.PickleError as perr:
ValueError
TypeError
trouableshooting
in
+
sys.stdout...
6. pickle>>> 定制的二进制格式,内容多了很多字符。
import pickle;
pickle.dump
pickle.load
same to : file sqlite3 dict...
7. sort>>>
sort(reverse=False)
sort(reverse=False)
降序reverse=True
推导列表==> clean_mikey = [sanitize(each_t) for each_t in mikey];
def sanitize(time_str):
if '-' in time_str :
splitter = '-';
elif ':' in time_str:
splitter = ':';
else:
return time_str;
(minute, secord) = time_str.split(splitter);
return minute + "." + secord;
去重复set()
print(sorted(set(lj1))[0:3]);
8. dict>>>
nulldict = {};
nulldict = dict();
type(adict);
adict['key']=value;
9. class>>>
class runplayer:
class AthleteList(list):
def __init__(self, _name, _birth=None, _times=[]):
list.__init__([]);
10. web app>>>
Model-View-Controller
string-Template 字符串替换
header = Template(head_next);
header.substitute(title=the_title)
yate模块 : 自定义html的组成部分
http.server web服务器
web服务器: Apache Ngnix Lighttpd...都支持cgi
cgi cgi.FieldStorage() 从CGI脚本访问发送到Web服务器的数据
cgitb cgitb.enable() cgi错误信息跟踪
glob 处理文件名列表
+x
*.py中要加上#! /usr/bin/python3
@property 类属性
netstat -anp | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 25564/python3
ps axu | grep 25564
neo 25564 0.0 0.0 62088 12596 pts/30 S+ 10:59 0:01 python3 simple_httpd.py
11. mobile app>>>
sl4a(Scripting Layer for Android) http://code.google.com/p/android-scripting
import android;
json Content-Type : application/json
json.decoder.JSONDecoder json.encoder.JSONEncoder
json.dumps() 创建Python类型的字符串
json.loads() 从一个Json字符串创建一个Python类型
urllib urllib2 : urlopen urlencode
BaseHTTPServer http.server
urllib.parse.unquote
12. other important module
os: environ
sqlite3: create/insert/delete/select connection cursor(.fetchone(), .fetchmany(), .fetchall()) execute commit rollback close ?(指定参数)
nosql mongoDB CouchDB
13. app engine
datastore
entity
property
14. opr
input("Enter your choose:"); raw_input();
set ()
import time
time.sleep(1)
time.localtime()
time.asctime()
time.strftime()
time.strptime()
time.gmtime()
15. Web Frameworks: Django Zope TurboGears Web2py(Webpy) Pylons
16. 测试框架与高级语言特性
xUnit(unittest)
doctest
匿名函数:lambda表达式
生成器:类似于迭代器,可以处理数据序列,yield(减少内存消耗)
自定义异常:
元类:自定义类
re:正则表达式
对象关系映射工具:object relational mapper ORM
GUI编程: tkinter PyGTK PyKDE wxPython PyQT
GIL Global Interpreter Lock全局解释器锁: 强制python只能在一个解释器进程中运行(不管有几个处理器可用)----> 不要使用线程
pprint模块 提供了打印出任何python数据结构类和方法。
pprint模块方法:
1.class pprint.PrettyPrinter(indent=1,width=80,depth=None, stream=None)
创建一个PrettyPrinter对象
indent --- 缩进,width --- 一行最大宽度,
depth --- 打印的深度,这个主要是针对一些可递归的对象,如果超出指定depth,其余的用"..."代替。
eg: a=[1,2,[3,4,],5] a的深度就是2; b=[1,2,[3,4,[5,6]],7,8] b的深度就是3
stream ---指输出流对象,如果stream=None,那么输出流对象默认是sys.stdout
2.pprint.pformat(object,indent=1,width=80, depth=None)
返回格式化的对象字符串
3.pprint.pprint(object,stream=None,indent=1, width=80, depth=None)
输出格式的对象字符串到指定的stream,最后以换行符结束。
4.pprint.isreadable(object)
判断对象object的字符串对象是否可读
5.pprint.isrecursive(object)
判断对象是否需要递归的表示
eg: pprint.isrecursive(a) --->False
pprint.isrecursive([1,2,3])-->True
6.pprint.saferepr(object)
返回一个对象字符串,对象中的子对象如果是可递归的,都被替换成<Recursionontypename withid=number>.这种形式。
简单的标准库链接
17. Django
安装django
git clone https://github.com/django/django.git
2.x sudo apt-get install python-pip
sudo pip install django
3.x sudo apt-get install python3-pip
sudo pip3 install django
Invalid HTTP_HOST header: '0.0.0.0:8000'. You may need to add '0.0.0.0' to ALLOWED_HOSTS.
In your project settings.py file,set ALLOWED_HOSTS like this :
ALLOWED_HOSTS = ['localhost', '127.0.0.1', '0.0.0.0']
创建项目HelloWorld
django-admin startproject HelloWorld
./HelloWorld 项目的容器
├── HelloWorld
│ ├── __init__.py 一个空文件,告诉 Python 该目录是一个 Python 包
│ ├── settings.py 该 Django 项目的设置/配置
│ ├── urls.py 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"
│ └── wsgi.py 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目
└── manage.py 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互
启动服务器: python manage.py runserver [0.0.0.0:][8000]
浏览器输入你服务器的ip及端口号(127.0.0.1:8000)
HelloWorld/HelloWorld/view.py
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world ! ")
绑定 URL 与视图函数 HelloWorld/HelloWorld/urls.py
from django.conf.urls import url
from . import view
urlpatterns = [
url(r'^$', view.hello), // 127.0.0.1:8000
//url(r'^hello$', view.hello), // 127.0.0.1:8000/hello
]
分析:
manage.py : HelloWorld.settings(对应HelloWorld/settings.py)
settings.py : 定义ROOT_URLCONF = 'HelloWorld.urls'(对应HelloWorld/urls.py)
urls.py : urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$', view.hello), ]
"""HelloWorld URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
看看view.py :
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world Django!")
urlpatterns : url(re, view, [kwargs, name]);
Django 模板标签 : {{ variable }} {% flag %}
if/else 标签: 支持and , or , not 关键字
{% if condition %}
... display
{% endif %}
或者
{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
for 标签 : 循环语法for X in Y , reversed反向迭代
{% for %} 。。。 {% endfor %}
ifequal/ifnotequal 标签 :
{% ifequal *** %}
。。。
{% else %}
。。。
{% endifequal %}
注释标签 : {# 这是一个注释 #}
过滤器 : 使用管道字符, 参数跟随冒号之后并且总是以双引号包含
{{ name|lower }} {{ my_list|first|upper }} {{ bio|truncatewords:"30" }}
addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。
date : 按指定的格式字符串参数格式化 date 或者 datetime 对象,实例: {{ pub_date|date:"F j, Y" }}
length : 返回变量的长度。
include 标签 : {% include %} 标签允许在模板中包含其它的模板的内容。
{% include "nav.html" %}
模板继承 :
0. 创建一个项目 django-admin startproject mysite
数据库的建立 python manage.py migrate
开发服务器:runserver的自动重载, python manage.py runserver 0.0.0.0:8000
Project vs App
django-admin startproject project1
python manage.py startapp app1 / django-admin startapp app1
1. 创建模型
python manage.py startapp polls
2. 激活模型
2.1 修改你的模型(在models.py文件中)。polls/models.py
from django.db import models
# Create your models here.
class Question(models.Model):
question_title = models.CharField(max_length=100);
question_text = models.CharField(max_length=200);
pub_date = models.DateTimeField('date published');
class Choice(models.Model):
question = models.ForeignKey(Question);
choice_text = models.CharField(max_length=200);
votes = models.IntegerField(default=0);
2.2 运行python manage.py makemigrations polls ,为这些修改创建迁移文件 (查看执行的语句python manage.py sqlmigrate app1 0001)
2.3 运行python manage.py migrate,将这些改变更新到数据库中。
3. 玩转API
给你的模型添加__str__()方法很重要,不仅会使你自己在使用交互式命令行时看得更加方便,而且会在Django自动生成的管理界面中使用对象的这种表示。
from django.db import models
class Question(models.Model):
# ...
def __str__(self): # __unicode__ on Python 2
return self.question_text
class Choice(models.Model):
# ...
def __str__(self): # __unicode__ on Python 2
python3 manage.py shell
>>> import mysite
>>> from polls.models import Question, Choice
>>> Question.objects.all()
[]
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
>>> q.save()
>>> q.id
1
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
>>> q.question_text = "What's up?"
>>> q.save()
>>> Question.objects.all()
[<Question: Question object>]
get_FOO_display()方法来访问选项字段的显示值
4. 管理
4.1 创建一个管理员用户
python manage.py createsuperuser
Username: admin
Email address: zoujm@jinglun.com.cn
Password:
Password (again):
Superuser created successfully.
goto >>> 127.0.0.1:8000/admin/
other:
01 . TypeError: context must be a dict rather than Context.
5. admin模块
5.1 ModelAdmin (django.contrib.admin.ModelAdmin)
5.1.1 actions
actions_on_top / actions_on_bottom
控制actions bar 出现在页面的位置。 默认情况下,管理员更改列表显示页面顶部的操作(actions_on_top = True; actions_on_bottom t4 > = False).
actions_selection_counter
控制选择计数器是否紧挨着下拉菜单action 默认的admin 更改列表将会显示它(actions_selection_counter = True).
date_hierarchy
Django如何重设Admin密码>>>
python3 manage.py shell
>>>
from django.contrib.auth.models import User
user = User.objects.get(username='admin')
user.set_password('new_password')
user.save()
12306>>>
pip3 install requests colorama docopt prettytable
XXXModel(models.Model)
字段:
选项:参数(null, blank, choices(get_FOO_display()), unique, unique_for_date, unique_for_month, unique_for_year, default, help_text, primary_key, error_messages, editable, db_column, db_index, db_tablespace, verbose_name, validators)
类型:Field子类(
ForeignKey(to, on_delete(CASCADE, PROTECT, SET_NULL, SET_DEFAULT, SET(), DO_NOTHING), limit_choices_to, related_name, related_query_name, to_field, db_constraint, swappable, ) 定义多对一关系,参数to:与该模型关联的类
ManyToManyField(to, related_name, related_query_name, symmetrical, through, through_fields, db_table, db_constraint, swappable) 定义多对多关系,参数to:与该模型关联的类
OneToOneField(to, on_delete, parent_link=False, ) 定义一对一关联关系,参数to:与该模型关联的类
CharField, ---> 默认的表单组件是一个TextInput
TextField, ---> 默认的表单组件是Textarea
AutoField,
BigAutoField, 一个64位整数,非常像AutoField,除了它保证适合1到9223372036854775807之间的数字。
BooleanField 如果你需要设置null 值,则使用NullBooleanField 来代替BooleanField。如果Field.default没有指定的话, BooleanField 的默认值是 None。 ---> 默认表单挂件是一个CheckboxInput.
NullBooleanField 类似BooleanField, 但是允许 NULL 作为一个选项. 使用此代替null=True的BooleanField。 ---> 默认表单widget为NullBooleanSelect
IntegerField -2147483648 到 2147483647 默认表单小部件是NumberInput。
SmallIntegerField -32768 至 32767
BigIntegerField, 一个64位整数,非常像IntegerField,除了它保证适合从-9223372036854775808到9223372036854775807的数字。---> 默认的表单组件是一个TextInput.
PositiveIntegerField 类似 IntegerField, 但值必须是正数或者零(0). 从0到2147483647的值在Django支持的所有数据库中都是安全的。 由于向后兼容性原因,接受值0。
PositiveSmallIntegerField 该模型字段类似 PositiveIntegerField, 但是只允许小于某一特定值(依据数据库类型而定)。 从0 到 32767 这个区间,对于Django所支持的所有数据库而言都是安全的。
FloatField 当localize为False或TextInput时,该字段的默认表单小部件是NumberInput。
BinaryField, 来存储原始二进制码的Field. 只支持bytes 赋值, 注意这个Field只有很有限的功能。 例如,不大可能在一个BinaryField 值的数据上进行查询 在ModelForm中也不可能包含BinaryField。
DateField(default=django.datetime.date.today(),auto_now, auto_now_add) ---> 默认的表单组件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮. 包含了一个额外的invalid_date错误消息键.
DateTimeField(default=django.utils.timezone.now()) ---> 默认对应的表单控件是一个单个的TextInput(单文本输入框). 管理界面是使用两个带有 JavaScript控件的 TextInput 文本框.
TimeField ---> 默认的表单组件是一个TextInput. Admin添加一些JavaScript快捷方式。
DurationField 类似Python中的timedelta.
FileField(upload_to=None, max_length=100,
FilePathField(path=None, match=None, recursive=False, max_length=100, allow_files, allow_folders )
ImageField(upload_to=None, height_field=None, width_field=None, max_length=100)
DecimalField(max_digits, decimal_places) ---> 当localize为False或TextInput时,该字段的默认表单小部件是NumberInput。
SlugField(max_length=50,allow_unicode=False)
GenericIPAddressField(protocol='both|ipv4|ipv6', unpack_ipv4=False, ) ---> 默认的表单组件是一个TextInput.
EmailField
URLField(max_length=200) ---> 默认的表单组件是一个TextInput.
UUIDField(default=uuid.uuid64)
)
自定义字段类型
跨文件的模型: 导入相关的模型,引用它
from geography.models import ZipCode
zip_code = models.ForeignKey(
ZipCode,
on_delete=models.SET_NULL,
blank=True,
null=True,
)
Meta选项
abstract
app_label 模型在INSTALLED_APPS中的应用程序之外定义app_label='myapp'如果要表示具有格式app_label.object_name或app_label.model_name的模型,可以使用model._meta.label或model._meta.label_lower。
base_manager_name 模型的_base_manager使用的管理器的名称。
db_table 该模型所用的数据表的名称:db_table = 'music_album' 默认:bookstore应用(使用manage.py startapp bookstore 创建),以class Book定义的模型的数据表的名称将是bookstore_book
db_tablespace 默认值是项目设置中的DEFAULT_TABLESPACE,如果它存在的话。 如果后端并不支持表空间,这个选项可以忽略。
default_manager_name 模型的_default_manager用到的管理器的名称。
default_related_name 从关联的对象反向查找当前对象用到的默认名称。 默认为 <model_name>_set。related_query_name
get_latest_by 模型中某个可排序的字段的名称,比如DateField、DateTimeField或者IntegerField。 它指定了Manager的latest()和earliest()中使用的默认字段。
managed 默认为True,表示Django会在migrate中创建合适的数据表,并且会在flush管理命令中移除它们。换句话说,Django会管理这些数据表的生命周期。如果是False,Django 就不会为当前模型创建和删除数据表。
order_with_respect_to 对于给定字段可以排序,通常为ForeignKey。设置和获取关联对象顺序的方法:get_RELATED_order() 和set_RELATED_order(),其中RELATED是小写的模型名称。 get_next_in_order() 和get_previous_in_order(),
ordering 对象默认的顺序,获取一个对象的列表时使用:ordering = ['-order_date']它是一个字符串的列表或元组。 每个字符串是一个字段名,前面带有可选的“-”前缀表示倒序。 前面没有“-”的字段表示正序。 使用字符串“?”来随机排序。
permissions 设置创建对象时权限表中额外的权限。 增加、删除和修改权限会自动为每个模型创建。 这个例子指定了一种额外的权限,can_deliver_pizzas:permissions = (("can_deliver_pizzas", "Can deliver pizzas"),) 它是一个包含二元组的元组或者列表,格式为 (permission_code, human_readable_permission_name)。
default_permissions 默认为('add', 'change', 'delete')。 你可以自定义这个列表,比如,如果你的应用不需要默认权限中的任何一项,可以把它设置成空列表。 在模型被migrate命令创建之前,这个属性必须被指定,以防一些遗漏的属性被创建。
required_db_features ['gis_enabled'] 仅在启用GIS的数据库上同步
proxy 如果proxy = True, 它作为另一个模型的子类,将会作为一个proxy model。
required_db_vendor sqlite,postgresql,mysql,oracle。
select_on_save 通常这个属性不需要设置。 默认为False。
indexes 在模型上定义的索引的列表
unique_together 设置的不重复的字段组合.它是一个元组的元组,组合起来的时候必须是唯一的。 它在Django后台中被使用,在数据库层上约束数据(比如,在 CREATE TABLE 语句中包含 UNIQUE语句)。
index_together
verbose_name 对象的一个易于理解的名称,为单数:verbose_name = "pizza" 如果此项没有设置,Django会把类名拆分开来作为自述名,比如CamelCase 会变成camel case,
verbose_name_plural 该对象复数形式的名称:verbose_name_plural = "stories" 如果此项没有设置,Django 会使用 verbose_name + "s"。
只读的Meta属性
label 对象的表示,返回app_label.object_name,例如'polls.Question'。
label_lower 模型的表示,返回app_label.model_name,例如'polls.question'。
模型_meta API:每个模型类的_meta属性访问,该属性是django.db.models.options.Options对象的实例。
按名称检索模型的单个字段实例 get_field(field_name) FieldDoesNotExist异常
检索模型的所有字段实例 get_fields(include_parents=True, include_hidden=False)
object
|--DecimalComparisonLookup
|--DecimalGreaterThan(, GreaterThan)
|--DecimalGreaterThanOrEqual(, GreaterThanOrEqual)
|--DecimalLessThan(, LessThan)
|--DecimalLessThanOrEqual(, LessThanOrEqual)
|--IntegerFieldFloatRounding
|--IntegerGreaterThanOrEqual(, GreaterThanOrEqual)
|--IntegerLessThan(, LessThan)
|--FieldGetDbPrepValueMixin
|--FieldGetDbPrepValueIterableMixin
|--In(, BuiltinLookup)
|--Range(, BuiltinLookup)
|--
|--Lookup
|--BuiltinLookup
|--IsNull
|--Search
|--
|--IExact
|--Exact(FieldGetDbPrepValueMixin, )
|--GreaterThan(FieldGetDbPrepValueMixin, )
|--GreaterThanOrEqual(FieldGetDbPrepValueMixin, )
|--LessThan(FieldGetDbPrepValueMixin, )
|--LessThanOrEqual(FieldGetDbPrepValueMixin, )
|--Regex
|--IRegex
|--PatternLookup
|--Contains
|--IContains
|--StartsWith
|--IStartsWith
|--EndsWith
|--IEndsWith
|--YearLookup
|--YearExact(YearLookup, Exact)
|--YearComparisonLookup
|--YearGt
|--YearGte
|--YearLt
|--YearLte
|--Combinable ---|
|--F |
|--ResolvedOuterRef |--Expression
|--OuterRef | |--CombinedExpression
|--BaseExpression ---| |--Case
|--OrderBy |--RawSQL
|--Star
|--Random
|--Col
|--Ref
|--ExpressionWrapper
|--When
|--Subquery
|--Exists
|--Value
|--DurationValue
|--Func
|--Cast
|--Coalesce
|--ConcatPair
|--Concat
|--Greatest
|--Least
|--Now
|--Substr
|--Transform(RegisterLookupMixin, )
|--Length
|--Lower
|--Upper
|--TimezoneMixin
|--TruncBase( ,Transform)
|--Trunc
|--TruncYear
|--TruncMonth
|--TruncDay
|--TruncDate
|--TruncTime
|--TruncHour
|--TruncMinute
|--TruncSecond
|--Extract( ,Transform)
|--ExtractYear
|--ExtractMonth
|--ExtractDay
|--ExtractWeek
|--ExtractWeekDay
|--ExtractHour
|--ExtractMinute
|--ExtractSecond
Django缓存框架
1. 设置:setting.py中
CACHES={
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}==> need python-memcached
2.1 分布式缓存:
Memcached 是个守护进程,它被分配了单独的内存块。 它做的所有工作就是为缓存提供一个快速的添加,检索,删除的接口。 所有的数据直接存储在内存中,所以它不能取代数据库或者文件系统的使用。
django.core.cache.backends.memcached.PyLibMCCache
django.core.cache.backends.memcached.MemcachedCache
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'unix:/tmp/memcached.sock',
}
}==> need python-memcached
or
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': '/tmp/memcached.sock',
}
}==> need pylibmc
几个物理机器
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11211',
or
'172.19.26.240:11211',
'172.19.26.242:11212',
'172.19.26.244:11213',
]
}
}
2.2 数据库缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
}
}
创建缓存表python3 manage.py createcachetable
多数据库的情况下使用数据库缓存,数据库缓存表要设置路由。
class CacheRouter(object):
"""A router to control all database cache operations"""
def db_for_read(self, model, **hints):
"All cache read operations go to the replica"
if model._meta.app_label == 'django_cache':
return 'cache_replica'
return None
def db_for_write(self, model, **hints):
"All cache write operations go to primary"
if model._meta.app_label == 'django_cache':
return 'cache_primary'
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"Only install the cache model on primary"
if app_label == 'django_cache':
return db == 'cache_primary'
return None
2.3 文件系统缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',#绝对路径
}
}
2.4 本地内存缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
2.5 虚拟缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
2.6 自定义缓存后端
参考Django源的django/core/cache/backends/
CACHES = {
'default': {
'BACKEND': 'path.to.backend',
}
}
3 缓存参数
TIMEOUT:300s,None
OPTIONS:
MAX_ENTRIES:高速缓存允许的最大条目数,超出这个数则旧值将被删除.这个参数默认是300.
CULL_ENTRIES:当达到MAX_FREQUENCY 的时候,被删除的条目比率。 实际比率是 1 / CULL_FREQUENCY, 所以设置CULL_FREQUENCY 为2会在达到MAX_ENTRIES 所设置值时删去一半的缓存。 这个参数应该是整数,默认为 3.把 CULL_FREQUENCY的值设置为 0 意味着当达到MAX_ENTRIES时,缓存将被清空。
KEY_PREFIX:
VERSION:
KEY_FUNCTION:
4. 站点缓存
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
]
CACHE_MIDDLEWARE_ALIAS – 用于存储的缓存的别名
CACHE_MIDDLEWARE_SECONDS –每个page需要被缓存多少秒.
CACHE_MIDDLEWARE_KEY_PREFIX – 如果缓存被使用相同Django安装的多个网站所共享,那么把这个值设成当前网站名,或其他能代表这个Django实例的唯一字符串,以避免key发生冲突。如果你不在意的话可以设成空字符串。
tips:
0. 安装 mysql 驱动
sudo pip install mysqlclient
modify settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 或者使用 mysql.connector.django
'NAME': 'test',
'USER': 'test',
'PASSWORD': 'test123',
'HOST':'localhost',
'PORT':'3306',
}
}
1. django.db.migrations.exceptions.InconsistentMigrationHistory:
In your migrations folder inside the project:
Delete the _pycache_ and the 0001_initial files.
Delete the db.sqlite3 from the root directory (be careful all your data will go away).
on the terminal run:
python3 manage.py makemigrations # 1. 创建更改的文件
python3 manage.py migrate # 2. 将生成的py文件应用到数据库
python3 manage.py flush # 3. 清空数据库
python3 manage.py dbshell # 4. 数据库命令行
2. 添加本地时间
import datetime, pytz
tz = pytz.timezone('Asia/Shanghai')
now = datetime.datetime.now(tz)
一般用法
from django.utils import timezone
now = timezone.now()
3. 超级管理员
python3 manage.py createsuperuser
python3 manage.py changepassword username
4. 导出数据 导入数据
python3 manage.py dumpdata appname > appname.json
python3 manage.py loaddata appname.json
5. Django 项目环境终端
python3 manage.py shell
6. 二维码
sudo pip3 install qrcode Image(pillow, olefile)
qr "https://www.baidu.com" > baidu.png
或者代码
def qr_2dcode(request, data):
image = qrcode.make(data)
buf = BytesIO()
image.save(buf)
image_stream = buf.getvalue()
response = HttpResponse(image_stream, content_type="image/png")
return response
https://code.ziqiangxuetang.com/python3/python3-stdlib.html
python -- 基础知识
最新推荐文章于 2022-09-05 14:08:03 发布