Python & Django 学习笔记

最近在学校 Python 和 Django。在学习中遇到了种种的问题,对于一个新手来说,下面的问题可能都会遇到。希望能帮助到那些和我一样的人!!
0.python-dev 安装(ubuntu)

 apt-get install  python-dev 

1.Open(filename,mode)

报错实例: f = open('d:\Users\168935495Request.xml','r')

错误信息 "SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape"

解决方法: f = open(r'd:\Users\168935495Request.xml','r')

原因:文件名中的 \U 开始的字符被编译器认为是八进制

2.Module Path

python 安装目录在 C:\Python33,fibo.py 文件在 E:\Python。

报错实例:import fibo

错误信息“ImportError: No module named 'fibo'

解决方法:import sys

     sys.path.append('E:\Python')

      import fibo

原因:需要在 sys 中配置工作目录

2.5 不同目录导入模块

错误信息“ImportError: No module named 'fibo'”

解决方法:在目录下新建空文件 __init__.py

3.Python2.7 中文不识别

错误信息“SyntaxError: Non-ASCII character '\xc9'

解决方法: 文件头 #coding=gbk

4.mysqldb 模块安装(目前只支持 python 2.7)

系统 32 位的从https://pypi.python.org/pypi/MySQL-python/1.2.4下然后直接安装

系统 64 位的从 http://arquivos.victorjabur.com/python/modules/MySQL-python-1.2.3.win-amd64-py2.7.exe 下然后直接安装

5.import MySQLdb 

错误信息:this is MySQLdb version (1,2,4,'beta',4),but _mysql is version (1,2,3,'final‘,0)

解决方法:删除 \Lib\site-packages 下所有的 mysqldb,重新安装

6. 格式化

整型数:%d 无符号整型数:%u 八进制:%o 十六进制:%x %X 浮点数:%f 科学记数法
字符串: %s 如果没有什么特殊需求完全可以全部使用’%s‘来标记

7.with 用法

with conn:
    conn.execute("insert into sometable values (?,?)",("foo","bar"))
在这个例子中,commit() 是在所有 with 数据块中的语句执行完毕并且没有错误之后自动执行的,如果出现任何的异常,将执行 rollback() 操作,再次提示异常

8. 文件每次修改后,需要重启服务

9.python 连接 MySQL 连接串(注意编码 )

python 连接 MySQL 时加上编码参数 conn = MySQLdb.Connection(host='localhost', user='root', passwd='123', db='test',charset='utf8')

9.5Django 配置 MySql
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', #Mysql 引擎
        'NAME': 'meiwei',                      # 数据库名,不需要路径以及后缀的  
        'USER': 'root',# 用户
        'PASSWORD': '',# 密码
        'HOST': '',                      # Empty for localhost through domain sockets or'127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}

10.Django 模板错误

错误信息:Requested setting TEMPLATE_DEBUG, but settings are not configured. You must either define

解决方法:from django.conf import settings  
     settings.configure()  

11. 设置静态资源路径

settings.py

import os.path

TEMPLATE_DIRS = (
#静态模块文件存放路径
os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)

使用处
from django.template.loader import get_template
 t = get_template('shoplist.html')

12.model 设置表名和主键自增 (django 默认的表是项目名 + 类名, 主键是 id)

from django.db import models

class Shop(models.Model):
        class Meta:
            db_table='shops'# 指定表名,忽略 django 自动映射的表名(项目 _class)
        ShopId  = models.AutoField(primary_key=True,db_column='sid')# 指定列名

13.Templates 模块

需要和 model 对象的属性一致(大小写敏感)

 14.Model 中的 __unicode__(self)

请确保你的每一个模型里都包含 __unicode__() 方法,这不只是为了交互时方便,也是因为 Django 会在其他一些地方用 __unicode__() 来显示对象。

15.DateTimeField received a naive datetime (2013-08-19 18:44:32) while time zone support is active.
settings 修改 USE_TZ=False

参考:https://docs.djangoproject.com;http://www.djangobook.com

16.form 自定义 error, 输出 message

class ShopForm(forms.Form):
def clean(self):
cleaned_data =self.cleaned_data
data_shopname = cleaned_data.get('shopname')
if data_shopname is None:
raise forms.ValidationError(u'商户名不能空')
if len(data_shopname)>50:
raise forms.ValidationError(u'商户名长度不能超过 50')
return cleaned_data

form = ShopForm(request.POST,error_class=ErrList)

message= form.errors['all'].unicode()

16.5 使用 Form 验证表单数据 (表单中的 name 名称必须和 form 类中的名称一致)

#form.py
class
ShopPicForm(forms.Form): shopname = forms.CharField(label="商户名",error_messages={"required":u"商户不可空"}) picname = forms.CharField(label="图片名",help_text="长度范围 2-20",max_length=20,min_length=2,error_messages={"required":u"图片名不可空","min_length":u"最小长度 2","max_length":u"最大长度 20"}) picup = forms.ImageField(label="选择图片",error_messages={"required":u"图片不可空"})
#view.py      
 form = ShopPicForm(request.POST)
 if form.is_valid():      
     #do something
  else:
     return render(request,"picadd.html",{"f":form})
#template
图片名:<input type="text" name="picname" value="{{f.data.picname}}"/> {{f.errors.picname.as_text}}<br/>
商户名:<input type="text" name ="shopname" autocomplete="on" value="{{f.data.shopname}}"/>{{f.errors.shopname.as_text}}<br/>

16.9 修改 errors 键的值:

#.py
from django.forms.util import ErrorList
form.errors['username'] = ErrorList([u'帐号错误'])
#.html
{{form.errors.username.as_text}}

17.Template 中使用 cleaned_data

  在 view.py 中使用 form.cleaned_data['键名'],template 中使用 form.cleaned_data. 键名

 18. 加载动态下拉框(数据从数据库查询)

#form 代码
 def __init__(self, *args, **kwargs):
        super(ShopForm, self).__init__(*args, **kwargs)  
        self.fields['cid'].choices = [('0','请选择')]+\
            [(c.cid,c.categoryname) for c in CategoryModel.objects.all()]
#另一种

CATEGORY_CHOICES = [('0','请选择')]+[(c.cid,c.categoryname) for c in CategoryModel.objects.all()]
cid = forms.ChoiceField(choices=CATEGORY_CHOICES)

#template 代码
{{form.cid}}
#model 代码
from django.db import models
class CategoryModel(models.Model):
    class Meta:
        db_table="categorys"
    cid  = models.AutoField(primary_key=True)
    categoryname = models.CharField(max_length=20)
    createtime = models.DateTimeField(auto_now_add = True)
    lastmodifytime = models.DateTimeField(auto_now = True)    
    def __unicode__(self):
        return u'%s' % (self.categoryname)

 19. 下拉框设置选中

#view.py
form.fields['cid'].choices = [(1,1),(2,2),(3,3)]
form.fields['cid'].initial = [2]# 选中第二个

 20. 图片上传

#model
 url = models.ImageField(upload_to = "%Y/%m/%d",blank=True)#注意此处头部不要带 /,否则会提示 Attempted access to '' denied.
#form
 url = forms.ImageField()
#view form = UploadFileForm(request.POST, request.FILES)必须要将 request.FILES 传给 form 的构造函数,才能将文件数据绑定到 form.
 if 'picup' in request.FILES:
            image = request.FILES["picup"]
        else:
            image =None
        name = request.POST["picname"]
        s = ShopPicModle(name=name,url=image)s.save()
#template
<form action="/pic/create/" method="post" enctype="multipart/form-data">
            图片名:<input type="text" name="picname"/><br/>
        图片:</span>&lt;input type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">file</span><span style="color: rgba(128, 0, 0, 1)">"</span> name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">picup</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;&lt;br/&gt;
        &lt;input type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">submit</span><span style="color: rgba(128, 0, 0, 1)">"</span> name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">添加</span><span style="color: rgba(128, 0, 0, 1)">"</span>/&gt; {% csrf_token %<span style="color: rgba(0, 0, 0, 1)">}            
    </span>&lt;/form&gt;</pre>

 20. 静态资源(图片)显示

#url 配置
 url(r'^images/(?P<path>.*)$','django.views.static.serve',  
        {'document_root': "/path/to/your/images/"}),#/person/web/web/images/
#template
<img src='/images/{{s.url}}' width="100px"/>

DB 中 URL 值:/shopspic/2013/08/29/ee244141a4874db7aeb034d3bd043306_550_412.jpg

图片在磁盘上的路径:person\web\web\images\shopspic\2013\08\29\ee244141a4874db7aeb034d3bd043306_550_412.jpg

21. 生产环境关闭 DEBUG,500 的错误

DEBUG = False,只是这样会出现 500 的错误,需要在 ALLOWED_HOSTS = ['域名' 或 'ip' 或 '*']。生产环境推荐使用域名

22.MD5 加密

from hashlib import md5

md5('加密字符串').hexdigest()

23.Cookie 设置

#设置 cookie
response = render_to_response("login.html", {"message":message})
response.set_cookie(key,value="vv",path='/')
return response

 # 获取 cookie 
  cookie = request.COOKIES.get(key)

24. 模板继承

 {%block%} 告诉模板引擎。子模块可以重载这部分。

#base.html
<html>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link type="text/css" rel="stylesheet" href="/static/css/base.css"/>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>{%block title %} {%endblock%}<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>后台管理<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">p </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="path"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
        当前位置:{%block path%}{%endblock%}
        </span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>欢迎你:{{admin}} <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">a </span><span style="color: rgba(255, 0, 0, 1)">href</span><span style="color: rgba(0, 0, 255, 1)">="#"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>注销<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
    {%block content%}{%endblock%}
</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

</html>

#piclist.html
{%extends "base.html"%}
{%block title %} 图片列表页面 {%endblock%}
{%block path%} 图片列表 {%endblock%}
{%block content%}
内容
{%endblock%}

25. 自定义 contextprocessor

a) 修改 settings

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'web.offline.cookie.logined', # 自定义的 context processors 函数, 格式: 项目. 包. 模块. 方法                
)

b)logined 方法

def logined(request):
    c = request.COOKIES.get(web.settings.COOKIENAME)
    if c:
        context = {'admin':c}
    else:
        context =  {'admin':"未登录"}
    return context #返回必须是字典

26. 配置多个数据库

#settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'meishi',                      #  database    
        'USER': '',
        'PASSWORD': '',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    },
   'backup': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'meishi2',                
        'USER': '',
        'PASSWORD': '',
        'HOST': '',  
        'PORT': '',                      # Set to empty string for default.
    }
}
#view.py
Shop.objects.all().order_by('-ShopId')#默认使用的是 default

Shop.objects.all().using('backup').order_by('-ShopId')#使用其他数据库

 27.Cookie 设置后跳转 Url(这个问题纠结了很久)

response = HttpResponseRedirect('/piclist/')#
response.set_cookie(web.settings.COOKIENAME,value=owner.name,path='/')
return response

 28. 自定义 404 页面

#urls.py
handler404 = 'project.view.404' 
#需要把 settings.py 中的 DEBUG=False 才会生效

 29. 提交表单报错:RuntimeError: You called this URL via POST,
      but the URL doesn’t end in a slash and you have APPEND_SLASH set.

将 from 的 action 地址改为 /结尾的就可以了
或者
修改 settings:APPEND_SLASH=False

30.Url 配置 name 参数,

1
2
3
4
5
#urls.py
url(r'^$', 'wetrip.views.home.index', name='home'),
#template
<a href="{%url 'home'%}">首页</a>
以后url地址发生变化,只需要修改urls文件即可.

 31. 文件操作 (需要目录已存在)

#view.py 写文件
file_handle = open(file_path,'w+')file_handle.write(data) #encode('utf8')
file_handle.close()
#读文件
file_handle = open(file_path)
data = file_handle.read()#decode('utf8')
file_handle.close()

 32. 目录创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#多层创建目录函数os.makedirs(path)。当父目录不存在的时候os.mkdir(path)不会创建,os.makedirs(path)则会创建父目录。
def mkdir(path):
    # 引入模块
    import os
    # 去除首位空格
    path=path.strip()
    # 去除尾部 \ 符号
    path=path.rstrip("\\")
  
    # 判断路径是否存在
    # 存在     True
    # 不存在   False
    isExists=os.path.exists(path)
  
    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
        print path+' 创建成功'
        # 创建目录操作函数
        os.makedirs(path)
        return True
    else:
        # 如果目录存在则不创建,并提示目录已存在
        print path+' 目录已存在'
        return False

 33. 返回 403

1. 在 settings.py 里面的 MIDDLEWARE_CLASSES 中加入 django.middleware.csrf.CsrfResponseMiddleware

2. 在 settings.py 里面的 MIDDLEWARE_CLASSES 中去掉 django.middleware.csrf.CsrfViewMiddleware

 34. 返回 Josn 格式数据

#view.py
from django.utils import simplejson

json={'ret':ret,'save_name':new_name}
#支持中文
return HttpResponse(simplejson.dumps(json,ensure_ascii = False))

 35.html 转义

#template
{% autoescape off %}
coding...
{% endautoescape %}
这里的 off 参数表明被 autoescape 包含的信息都不需要执行 HTML 转义。on 参数表示需要执行 HTML 转义

 36. 访问远程图片

import cStringIO, urllib2, Image

url = 'remote picture'
file
= urllib2.urlopen(url)
tmpIm
= cStringIO.StringIO(file.read())
im
= Image.open(tmpIm)

 37.‘gbk'codec can't encode character 错误

#忽略特殊字符
str.encode('gbk','ignore')

 38. 获取 Post name 相同的值 (如多个 checkbox)

#view.py
request.POST.getlist('name')

 39. 创建 Django(path 到 django 目录下)

django-admin.py startproject mysite

40. 中文输出

  u'中文'

41. 模板注释

{# 文字 #}注释的内容不会在模板渲染时输出。注释不能跨多行

42. 密码框

password = forms.CharField(widget=forms.PasswordInput())

43.Template 中 {{变量}} 不要换行

44.'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)  python 版本 2.7

在 model 中增加

def __unicode__(self):
      return self.question_text

 

未完待续...