python -- 基础知识

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值