西维蜀黍

【Python】Exception

try-except

try:
    raise FError("自定义异常")
except FError as e:
    print(e)

自定义异常

class ObjectNotExistInDBError(Exception):
    def __init__(self,msg):
        super(ObjectNotExistInDBError,self).__init__(self)
        self.msg=msg
    def __str__(self):
        return self.msg

抛出异常

主动抛出异常:

raise RuntimeError('testError')
  ...


【Django】Error - Django : Table doesn't exist

  ...


【Python】import

模块(Module)和包(Package)

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)

使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)

举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

现在,假设我们的abcxyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下目录存放:

mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz

请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany

类似的,可以有多级目录,组成多级层次的包结构。比如如下的目录结构:

mycompany
 ├─ web
 │  ├─ __init__.py
 │  ├─ utils.py
 │  └─ www.py
 ├─ __init__.py
 ├─ abc.py
 └─ utils.py

文件www.py的模块名就是mycompany.web.www,两个文件utils.py的模块名分别是mycompany.utilsmycompany.web.utils

自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。

Absolute Import

from src.packone import test1

绝对引用通过package的绝对路径引入module,且路径要从最上一层的package写起。

from xxx import *

# constants.py
MAX_ENTITY_NUMBER_LIMIT_FOR_DB_QUERY = 500
DEFAULT_ENTITY_NUMBER_FOR_DB_QUERY = 50

def a():
	pass

如果通过from core.constants import *,则 core.constants(对应constants.py文件)中定义的所有变量和函数,都可以在 views.py 中直接使用(无需通过 constants.MAX_ENTITY_NUMBER_LIMIT_FOR_DB_QUERY 来调用,就好像把constants.py文件全文复制到了views.py 中)

#views.py
from core.constants import *

def get_limit(l):
		a()
    if l is None:
        l = DEFAULT_ENTITY_NUMBER_FOR_DB_QUERY
    else:
        if l > MAX_ENTITY_NUMBER_LIMIT_FOR_DB_QUERY:
            l = DEFAULT_ENTITY_NUMBER_FOR_DB_QUERY
    return l
  ...


【Django】Django 读写 Cookie

获取Cookie

request.COOKIES[key]
request.COOKIES.get(key)
# 普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

参数:

  • default: 默认值
  • salt: 加密盐
  • max_age: 后台控制过期时间
  ...


【HTTP】Cookie

用途

因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。

Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

  ...


【Python】Collection - set

Set

Sets are a recent addition to the language that are neither mappings nor sequences; rather, they are unordered collections of unique and immutable objects. You create sets by calling the built-in set function or using new set literals and expressions in 3.X and 2.7, and they support the usual mathematical set operations (the choice of new {…} syntax for set literals makes sense, since sets are much like the keys of a valueless dic-tionary):

>>> X = set('spam')														# Make a set out of a sequence in 2.X and 3.X
>>> Y = {'h', 'a', 'm'}												# Make a set with set literals in 3.X and 2.7

>>> X, Y 																			# A tuple of two sets without parentheses 
({'m', 'a', 'p', 's'}, {'m', 'a', 'h'})

>>> X & Y 																		# Intersection 
{'m', 'a'}
>>> X | Y 																		# Union 
{'m', 'h', 'a', 'p', 's'}
>>> X - Y 																		# Difference
  ...


【Python】Basics - 函数参数

定义函数

>>> def fib(n):    # write Fibonacci series up to n
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
  ...


【Django】Django Form

Django’s role in forms

Django’s form functionality can simplify and automate vast portions of this work, and can also do it more securely than most programmers would be able to do in code they wrote themselves.

Django handles three distinct parts of the work involved in forms:

  • preparing and restructuring data to make it ready for rendering
  • creating HTML forms for the data
  • receiving and processing submitted forms and data from the client

It is possible to write code that does all of this manually, but Django can take care of it all for you.

  ...


【SQL】清空表数据后如何让自增 ID 从 1 开始

Problem

MySQL清空表中数据后,如何让自增ID从1开始?

Solution

清空表中数据时,使用truncate命令,而不用delete命令。

mysql> truncate test;
  ...


【MySQL】ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key

Problem

mysql删除主键重复ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key

Analysis

若一个table 中的某个column是其他table的foreign key,那么,就不能使用对该table 使用truncate 或者drop SQL命令。

  ...