设为首页 收藏本站
查看: 1046|回复: 0

[经验分享] Python & Django 学习笔记

[复制链接]

尚未签到

发表于 2015-4-26 03:01:33 | 显示全部楼层 |阅读模式
  最近在学校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
图片名: {{f.errors.picname.as_text}}
商户名:{{f.errors.shopname.as_text}}
DSC0000.jpg
  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

图片名:
图片:
{% csrf_token %}            

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



#url配置
url(r'^images/(?P.*)$','django.views.static.serve',  
{'document_root': "/path/to/your/images/"}),#/person/web/web/images/


#template

  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



{%block title %} {%endblock%}

后台管理

当前位置:{%block path%}{%endblock%}
欢迎你:{{admin}} 注销

{%block content%}{%endblock%}


#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参数,



#urls.py
url(r'^$', 'wetrip.views.home.index', name='home'),
#template
首页
以后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.目录创建



#多层创建目录函数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中{{ 变量}} 不要换行
  未完待续...

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60578-1-1.html 上篇帖子: python threadpool使用注意事项 下篇帖子: python cookielib 登录人人网
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表