diff --git a/__init__fang-fa.html b/__init__fang-fa.html new file mode 100644 index 0000000..d801b4f --- /dev/null +++ b/__init__fang-fa.html @@ -0,0 +1,149 @@ + + + + + + + + + + __init__()方法 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/archives.html b/archives.html index e67244e..baa6631 100644 --- a/archives.html +++ b/archives.html @@ -98,6 +98,180 @@

All Posts

  • TLCL 看书笔记(2)
  • +
  • Django开启 the sites framework + +
  • +
  • Django 1.7试用 + +
  • +
  • django 国际化 + +
  • +
  • Django 数据查询 + +
  • +
  • Django Validators + +
  • +
  • I am just Testing + +
  • +
  • related Field has invalid lookup: icontains 解决方法 + +
  • +
  • 试用 Django 1.7 + +
  • +
  • Ubuntu 12.04中文输入法的安装 + +
  • +
  • 回家路 + +
  • +
  • 格式化字符串——时间 + +
  • +
  • Python时间操作 + +
  • +
  • Python中raw_input和input的异同点 + +
  • +
  • __init__()方法 + +
  • +
  • django 分页 + +
  • +
  • Django 使用邮件服务 + +
  • +
  • init__()方法 + +
  • +
  • python 实例方法,静态方法,类方法 + +
  • +
  • python中 __(双下划线)的作用 + +
  • +
  • Python with语句 + +
  • +
  • python exec和eval语句 + +
  • +
  • str()与repr()的区别 + +
  • +
  • Mysql语句入门(1) + +
  • +
  • Django 备份数据方法(1) + +
  • +
  • Django中使用mysql数据库 + +
  • +
  • Xadmin List_display中显示缩略图 + +
  • +
  • Xadmin中自动预填某个字段 + +
  • +
  • Ueditor在Django中的使用 + +
  • +
  • Xadmin入门(2) + +
  • +
  • 郁闷的发现一个双胞胎师兄 + +
  • +
  • 把时间当作朋友读后感(1) + +
  • +
  • 把时间当作朋友读后感(2) + +
  • +
  • 部署Socket.io 的demo + +
  • +
  • Django Dir 配置(方法一) + +
  • +
  • PEP8 总结 + +
  • +
  • 用Django mptt后台中生成树状数据结构 + +
  • +
  • Edx_errors + +
  • +
  • 在真机上部署Edx(在中国) + +
  • +
  • 翻墙之电脑篇 + +
  • +
  • 使用ngrok将内网端口映射到外网 + +
  • +
  • Xadmin入门 + +
  • +
  • 汉化edx-platform + +
  • +
  • Linux特别强大和灵活的命令行工具 (1) + +
  • +
  • 使用Edx platform + +
  • +
  • 命令行下使用VirtualBox + +
  • +
  • Ubuntu 用户用命令安装 VirtualBox 4.3.8 + +
  • +
  • sshd_config配置 + +
  • +
  • SSH原理 + +
  • +
  • Tmux 入门 + +
  • +
  • Github上搭博客 + +
  • +
  • linux 小技巧(1) + +
  • +
  • Shell脚本编程30分钟入门 + +
  • +
  • Django Media 配置(方法一) + +
  • +
  • Django-userena 的使用 + +
  • +
  • Git 入门 + +
  • +
  • git 取消错误的上传 + +
  • +
  • linux 小技巧(2) + +
  • +
  • count(*) vs exists() + +
  • diff --git a/author/won3.html b/author/won3.html new file mode 100644 index 0000000..a5d3e0e --- /dev/null +++ b/author/won3.html @@ -0,0 +1,143 @@ + + + + + + + + + Tugqi Biz - Articles by Won + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/author/won4.html b/author/won4.html new file mode 100644 index 0000000..a5d3e0e --- /dev/null +++ b/author/won4.html @@ -0,0 +1,143 @@ + + + + + + + + + Tugqi Biz - Articles by Won + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/author/won5.html b/author/won5.html new file mode 100644 index 0000000..a5d3e0e --- /dev/null +++ b/author/won5.html @@ -0,0 +1,143 @@ + + + + + + + + + Tugqi Biz - Articles by Won + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/author/won6.html b/author/won6.html new file mode 100644 index 0000000..a5d3e0e --- /dev/null +++ b/author/won6.html @@ -0,0 +1,143 @@ + + + + + + + + + Tugqi Biz - Articles by Won + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/author/won7.html b/author/won7.html new file mode 100644 index 0000000..a5d3e0e --- /dev/null +++ b/author/won7.html @@ -0,0 +1,143 @@ + + + + + + + + + Tugqi Biz - Articles by Won + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/author/won8.html b/author/won8.html new file mode 100644 index 0000000..a5d3e0e --- /dev/null +++ b/author/won8.html @@ -0,0 +1,143 @@ + + + + + + + + + Tugqi Biz - Articles by Won + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ba-shi-jian-dang-zuo-peng-you-du-hou-gan-1.html b/ba-shi-jian-dang-zuo-peng-you-du-hou-gan-1.html new file mode 100644 index 0000000..8967a56 --- /dev/null +++ b/ba-shi-jian-dang-zuo-peng-you-du-hou-gan-1.html @@ -0,0 +1,135 @@ + + + + + + + + + + 把时间当作朋友读后感(1) · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ba-shi-jian-dang-zuo-peng-you-du-hou-gan-2.html b/ba-shi-jian-dang-zuo-peng-you-du-hou-gan-2.html new file mode 100644 index 0000000..357da77 --- /dev/null +++ b/ba-shi-jian-dang-zuo-peng-you-du-hou-gan-2.html @@ -0,0 +1,130 @@ + + + + + + + + + + 把时间当作朋友读后感(2) · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bu-shu-socketio-de-demo.html b/bu-shu-socketio-de-demo.html new file mode 100644 index 0000000..f1e5dbd --- /dev/null +++ b/bu-shu-socketio-de-demo.html @@ -0,0 +1,151 @@ + + + + + + + + + + 部署Socket.io 的demo · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/categories.html b/categories.html index 24fb7e7..b825b87 100644 --- a/categories.html +++ b/categories.html @@ -60,7 +60,7 @@

    All Categories

    - It10 + It63
    @@ -86,6 +86,112 @@

    All Categories

  • git 复习巩固(4)
  • git 复习巩固(5)
  • + +
  • Django开启 the sites framework
  • + +
  • Django 1.7试用
  • + +
  • django 国际化
  • + +
  • Django 数据查询
  • + +
  • Django Validators
  • + +
  • I am just Testing
  • + +
  • related Field has invalid lookup: icontains 解决方法
  • + +
  • 试用 Django 1.7
  • + +
  • Ubuntu 12.04中文输入法的安装
  • + +
  • 格式化字符串——时间
  • + +
  • Python时间操作
  • + +
  • Python中raw_input和input的异同点
  • + +
  • __init__()方法
  • + +
  • django 分页
  • + +
  • Django 使用邮件服务
  • + +
  • init__()方法
  • + +
  • python 实例方法,静态方法,类方法
  • + +
  • python中 __(双下划线)的作用
  • + +
  • Python with语句
  • + +
  • python exec和eval语句
  • + +
  • str()与repr()的区别
  • + +
  • Mysql语句入门(1)
  • + +
  • Django 备份数据方法(1)
  • + +
  • Django中使用mysql数据库
  • + +
  • Xadmin List_display中显示缩略图
  • + +
  • Xadmin中自动预填某个字段
  • + +
  • Ueditor在Django中的使用
  • + +
  • Xadmin入门(2)
  • + +
  • 部署Socket.io 的demo
  • + +
  • Django Dir 配置(方法一)
  • + +
  • PEP8 总结
  • + +
  • 用Django mptt后台中生成树状数据结构
  • + +
  • Edx_errors
  • + +
  • 在真机上部署Edx(在中国)
  • + +
  • 翻墙之电脑篇
  • + +
  • 使用ngrok将内网端口映射到外网
  • + +
  • Xadmin入门
  • + +
  • 汉化edx-platform
  • + +
  • Linux特别强大和灵活的命令行工具 (1)
  • + +
  • 使用Edx platform
  • + +
  • 命令行下使用VirtualBox
  • + +
  • Ubuntu 用户用命令安装 VirtualBox 4.3.8
  • + +
  • sshd_config配置
  • + +
  • SSH原理
  • + +
  • Tmux 入门
  • + +
  • linux 小技巧(1)
  • + +
  • Shell脚本编程30分钟入门
  • + +
  • Django Media 配置(方法一)
  • + +
  • Django-userena 的使用
  • + +
  • Git 入门
  • + +
  • git 取消错误的上传
  • + +
  • linux 小技巧(2)
  • + +
  • count(*) vs exists()
  • @@ -93,7 +199,7 @@

    All Categories

    - Life1 + Life6
    @@ -101,6 +207,16 @@

    All Categories

    diff --git a/category/it2.html b/category/it2.html new file mode 100644 index 0000000..08d9f80 --- /dev/null +++ b/category/it2.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/category/it3.html b/category/it3.html new file mode 100644 index 0000000..08d9f80 --- /dev/null +++ b/category/it3.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/category/it4.html b/category/it4.html new file mode 100644 index 0000000..08d9f80 --- /dev/null +++ b/category/it4.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/category/it5.html b/category/it5.html new file mode 100644 index 0000000..08d9f80 --- /dev/null +++ b/category/it5.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/category/it6.html b/category/it6.html new file mode 100644 index 0000000..08d9f80 --- /dev/null +++ b/category/it6.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/category/it7.html b/category/it7.html new file mode 100644 index 0000000..08d9f80 --- /dev/null +++ b/category/it7.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/category/life.html b/category/life.html index b038d0f..2bba1e8 100644 --- a/category/life.html +++ b/category/life.html @@ -64,6 +64,36 @@

    Recent Posts Wed 01 April 2015 + + + + + diff --git a/count-vs-exists.html b/count-vs-exists.html new file mode 100644 index 0000000..78e6149 --- /dev/null +++ b/count-vs-exists.html @@ -0,0 +1,229 @@ + + + + + + + + + + count(*) vs exists() · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/django-17shi-yong.html b/django-17shi-yong.html new file mode 100644 index 0000000..044d424 --- /dev/null +++ b/django-17shi-yong.html @@ -0,0 +1,205 @@ + + + + + + + + + + Django 1.7试用 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/django-bei-fen-shu-ju-fang-fa-1.html b/django-bei-fen-shu-ju-fang-fa-1.html new file mode 100644 index 0000000..de2ed3b --- /dev/null +++ b/django-bei-fen-shu-ju-fang-fa-1.html @@ -0,0 +1,134 @@ + + + + + + + + + + Django 备份数据方法(1) · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/django-dir-pei-zhi-fang-fa-yi.html b/django-dir-pei-zhi-fang-fa-yi.html new file mode 100644 index 0000000..d09aefd --- /dev/null +++ b/django-dir-pei-zhi-fang-fa-yi.html @@ -0,0 +1,185 @@ + + + + + + + + + + Django Dir 配置(方法一) · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/django-fen-ye.html b/django-fen-ye.html new file mode 100644 index 0000000..6e0b593 --- /dev/null +++ b/django-fen-ye.html @@ -0,0 +1,191 @@ + + + + + + + + + + django 分页 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/django-guo-ji-hua.html b/django-guo-ji-hua.html new file mode 100644 index 0000000..8d3af40 --- /dev/null +++ b/django-guo-ji-hua.html @@ -0,0 +1,189 @@ + + + + + + + + + + django 国际化 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/django-media-pei-zhi-fang-fa-yi.html b/django-media-pei-zhi-fang-fa-yi.html new file mode 100644 index 0000000..488dfca --- /dev/null +++ b/django-media-pei-zhi-fang-fa-yi.html @@ -0,0 +1,153 @@ + + + + + + + + + + Django Media 配置(方法一) · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/django-shi-yong-you-jian-fu-wu.html b/django-shi-yong-you-jian-fu-wu.html new file mode 100644 index 0000000..ff3aadc --- /dev/null +++ b/django-shi-yong-you-jian-fu-wu.html @@ -0,0 +1,142 @@ + + + + + + + + + + Django 使用邮件服务 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/django-shu-ju-cha-xun.html b/django-shu-ju-cha-xun.html new file mode 100644 index 0000000..f1a982e --- /dev/null +++ b/django-shu-ju-cha-xun.html @@ -0,0 +1,422 @@ + + + + + + + + + + Django 数据查询 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/django-userena-de-shi-yong.html b/django-userena-de-shi-yong.html new file mode 100644 index 0000000..41f040a --- /dev/null +++ b/django-userena-de-shi-yong.html @@ -0,0 +1,290 @@ + + + + + + + + + + Django-userena 的使用 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/django-validators.html b/django-validators.html new file mode 100644 index 0000000..ff0cfec --- /dev/null +++ b/django-validators.html @@ -0,0 +1,190 @@ + + + + + + + + + + Django Validators · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/djangokai-qi-the-sites-framework.html b/djangokai-qi-the-sites-framework.html new file mode 100644 index 0000000..b75b6bc --- /dev/null +++ b/djangokai-qi-the-sites-framework.html @@ -0,0 +1,139 @@ + + + + + + + + + + Django开启 the sites framework · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/djangozhong-shi-yong-mysqlshu-ju-ku.html b/djangozhong-shi-yong-mysqlshu-ju-ku.html new file mode 100644 index 0000000..991a0e0 --- /dev/null +++ b/djangozhong-shi-yong-mysqlshu-ju-ku.html @@ -0,0 +1,171 @@ + + + + + + + + + + Django中使用mysql数据库 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/edx_errors.html b/edx_errors.html new file mode 100644 index 0000000..8ea6ade --- /dev/null +++ b/edx_errors.html @@ -0,0 +1,316 @@ + + + + + + + + + + Edx_errors · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fan-qiang-zhi-dian-nao-pian.html b/fan-qiang-zhi-dian-nao-pian.html new file mode 100644 index 0000000..54b21ae --- /dev/null +++ b/fan-qiang-zhi-dian-nao-pian.html @@ -0,0 +1,144 @@ + + + + + + + + + + 翻墙之电脑篇 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feeds/won.atom.xml b/feeds/won.atom.xml index 7bdbf15..72bbe12 100644 --- a/feeds/won.atom.xml +++ b/feeds/won.atom.xml @@ -151,6 +151,18 @@ <span class="mi">2</span><span class="p">)</span> <span class="nx">Then</span> <span class="nx">change</span> <span class="nx">ownership</span><span class="p">:</span> <span class="nb">chown</span> <span class="nx">mysql.mysql</span> <span class="o">&lt;</span><span class="nb">filename</span><span class="o">&gt;</span> <span class="mi">3</span><span class="p">)</span> <span class="nx">Now</span> <span class="nx">try</span> <span class="nx">LOAD</span> <span class="kd">DATA</span> <span class="nx">INFILE</span> <span class="nx">command.</span> <span class="nx">It</span> <span class="nx">will</span> <span class="nx">work.</span> +</pre></div> + + +<p><strong> Displaying Query Results Vertically</strong></p> +<div class="highlight"><pre><span class="n">select</span> <span class="o">*</span> <span class="n">from</span> <span class="n">name</span> <span class="n">limit</span> <span class="mi">10</span><span class="p">,</span><span class="mi">1</span><span class="err">\</span><span class="n">G</span><span class="p">;</span> +</pre></div> + + +<p><strong>drop table with foreign Key</strong> </p> +<div class="highlight"><pre><span class="n">SET</span> <span class="n">foreign_key_checks</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> +<span class="n">drop</span> <span class="n">table</span> <span class="p">...</span> +<span class="n">SET</span> <span class="n">foreign_key_checks</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> </pre></div>Python 代码片段2015-03-30T00:00:00+08:00Wontag:wbowam.github.io,2015-03-30:python-dai-ma-pian-duan.html<h4 id="python-logging">python logging<a class="headerlink" href="#python-logging" title="Permanent link">&para;</a></h4> <div class="highlight"><pre><span class="n">import</span> <span class="n">logging</span> <span class="n">logging</span><span class="p">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">getcwd</span><span class="p">(),</span> <span class="err">&#39;</span><span class="n">log</span><span class="p">.</span><span class="n">txt</span><span class="err">&#39;</span><span class="p">),</span> <span class="n">level</span> <span class="o">=</span> <span class="n">logging</span><span class="p">.</span><span class="n">DEBUG</span><span class="p">)</span> @@ -792,4 +804,4337 @@ grep 能够匹配的模式可以 很复杂,但是现在我们把 <p>grep - 打印匹配行</p> </blockquote> <p>神一样的命令终于出现了,看到这里我再次确定这是一本好书了 -话说XX推荐用<a href="http://beyondgrep.com/">ACK</a>替代grep</p> \ No newline at end of file +话说XX推荐用<a href="http://beyondgrep.com/">ACK</a>替代grep</p>Django开启 the sites framework2014-10-07T00:00:00+08:00Wontag:wbowam.github.io,2014-10-07:djangokai-qi-the-sites-framework.html<p>以下内容来自Django文档</p> +<div class="highlight"><pre><span class="n">Changed</span> <span class="n">in</span> <span class="n">Django</span> <span class="mf">1.6</span><span class="o">:</span> +<span class="n">In</span> <span class="n">previous</span> <span class="n">versions</span><span class="p">,</span> <span class="n">the</span> <span class="n">sites</span> <span class="n">framework</span> <span class="n">was</span> <span class="n">enabled</span> <span class="n">by</span> <span class="k">default</span><span class="p">.</span> + +<span class="n">To</span> <span class="n">enable</span> <span class="n">the</span> <span class="n">sites</span> <span class="n">framework</span><span class="p">,</span> <span class="n">follow</span> <span class="n">these</span> <span class="n">steps</span><span class="o">:</span> + +<span class="n">Add</span> <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sites</span><span class="err">&#39;</span> <span class="n">to</span> <span class="n">your</span> <span class="n">INSTALLED_APPS</span> <span class="n">setting</span><span class="p">.</span> + +<span class="n">Define</span> <span class="n">a</span> <span class="n">SITE_ID</span> <span class="n">setting</span><span class="o">:</span> + +<span class="n">SITE_ID</span> <span class="o">=</span> <span class="mi">1</span> +<span class="n">Run</span> <span class="n">migrate</span><span class="p">.</span> +</pre></div>Django 1.7试用2014-09-07T00:00:00+08:00Wontag:wbowam.github.io,2014-09-07:django-17shi-yong.html<p>首先感谢django团队,在这一版本里django自身提供了数据迁移功能——migration</p> +<h3 id="_1">数据迁移<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>修改Model后可以在不影响现有数据的前提下重建表结构。 </p> +<h6 id="southsouthdjango">以往的解决方案是South(于是South成为了django必备的,最受欢迎的应用。)<a class="headerlink" href="#southsouthdjango" title="Permanent link">&para;</a></h6> +<h4 id="_2">原理<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p>django的migration功能,类似与South的migration功能。 </p> +<h5 id="_3">开始一个新的项目<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">django</span><span class="o">-</span><span class="n">admin</span><span class="p">.</span><span class="n">py</span> <span class="n">startproject</span> <span class="n">mysite</span> +<span class="cp">## Create the tables in the database before we can use them.</span> +<span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">migrate</span> +<span class="cp">## Create superuser.</span> +<span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">createsuperuser</span> +</pre></div> + + +<h5 id="app">创建app:<a class="headerlink" href="#app" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">startapp</span> <span class="n">myblog</span> +<span class="cp">##1.7版django这一步时会创建一个migrations/目录</span> +</pre></div> + + +<div class="highlight"><pre><span class="cp">##settings.py</span> +<span class="n">INSTALLED_APPS</span> <span class="o">=</span><span class="p">(</span> + <span class="err">####</span> + <span class="err">&#39;</span><span class="n">myblog</span><span class="err">&#39;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<div class="highlight"><pre><span class="cp">##models.py</span> +<span class="n">class</span> <span class="n">Article</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> +</pre></div> + + +<h5 id="_4">生成数据表<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h5> +<p>(覆盖了syncdb功能,不过别担心,syncdb仍然还有~) </p> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">makemigrations</span> <span class="n">myblog</span> +</pre></div> + + +<p>运行结果如下</p> +<div class="highlight"><pre><span class="n">Migrations</span> <span class="k">for</span> <span class="err">‘</span><span class="n">myblog</span><span class="err">’</span><span class="o">:</span> + <span class="mo">0001</span><span class="n">_initial</span><span class="p">.</span><span class="n">py</span><span class="o">:</span> + <span class="o">-</span> <span class="n">Create</span> <span class="n">model</span> <span class="n">Article</span> +</pre></div> + + +<p>看看生成了哪些文件</p> +<div class="highlight"><pre><span class="n">ls</span> <span class="n">myblog</span><span class="o">/</span><span class="n">migrations</span><span class="o">/</span> +<span class="n">__init__</span><span class="p">.</span><span class="n">py</span> <span class="mo">0001</span><span class="n">_initial</span><span class="p">.</span><span class="n">py</span> +</pre></div> + + +<h4 id="modelsauthor">修改models,添加一个author属性<a class="headerlink" href="#modelsauthor" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Article</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + <span class="n">author</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> +</pre></div> + + +<h5 id="_5">生成数据表(修改后)<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">makemigrations</span> <span class="n">myblog</span> +<span class="cp">##运行结果</span> +<span class="n">Migrations</span> <span class="k">for</span> <span class="err">‘</span><span class="n">myblog</span><span class="err">’</span><span class="o">:</span> + <span class="mo">0002</span><span class="n">_article_author</span><span class="p">.</span><span class="n">py</span><span class="o">:</span> + <span class="o">-</span> <span class="n">Add</span> <span class="n">field</span> <span class="n">author</span> <span class="n">to</span> <span class="n">article</span> +</pre></div> + + +<p>我们来看看他重新生成数据表时干了些什么 +<em> 从上一个migration中获取之前的Model列表,写到set中. +</em> 获取现有的model列表,写入set中。 +* 遍历这两个set的差集,获取差集Model中所有的field,如果field的定义相同,就询问用户是否是一个rename的model,否则视为创建。</p> +<h4 id="migrate">数据迁移(migrate)<a class="headerlink" href="#migrate" title="Permanent link">&para;</a></h4> +<p><code>python manage.py migrate myblog</code> </p> +<hr /> +<p>That's all +以上是个人对migration的理解,求纠错和指点~~</p>django 国际化2014-09-07T00:00:00+08:00Wontag:wbowam.github.io,2014-09-07:django-guo-ji-hua.html<h2 id="python">第一步:在你的Python代码和模板中嵌入待翻译的字符串。<a class="headerlink" href="#python" title="Permanent link">&para;</a></h2> +<p>我选择用如下方式: <br /> +models </p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">translation</span> <span class="n">import</span> <span class="n">ugettext_lazy</span> <span class="n">as</span> <span class="n">_</span> + +<span class="n">class</span> <span class="n">MyThing</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">name</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">),</span> <span class="n">help_text</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">This</span> <span class="n">is</span> <span class="n">the</span> <span class="n">help</span> <span class="n">text</span><span class="err">&#39;</span><span class="p">))</span> + <span class="n">class</span> <span class="n">Meta</span><span class="o">:</span> + <span class="n">verbose_name</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">my</span> <span class="n">thing</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">verbose_name_plural</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">mythings</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>template </p> +<div class="highlight"><pre><span class="cp">{%</span> <span class="k">load</span> <span class="nv">i18n</span> <span class="cp">%}</span> 放在模板最前面。 +###翻译一个常量字符串 (括以单或双引号) 或 可变内容: +<span class="nt">&lt;title&gt;</span><span class="cp">{%</span> <span class="k">trans</span> <span class="s2">&quot;This is the title.&quot;</span> <span class="cp">%}</span><span class="nt">&lt;/title&gt;</span> +<span class="nt">&lt;title&gt;</span><span class="cp">{%</span> <span class="k">trans</span> <span class="nv">myvar</span> <span class="cp">%}</span><span class="nt">&lt;/title&gt;</span> +### 如果你的译文要求字符串带有变量(占位符placeholders),请使用 <span class="cp">{%</span> <span class="k">blocktrans</span> <span class="cp">%}</span> : +<span class="cp">{%</span> <span class="k">blocktrans</span> <span class="cp">%}</span>This string will have <span class="cp">{{</span> <span class="nv">value</span> <span class="cp">}}</span> inside.<span class="cp">{%</span> <span class="k">endblocktrans</span> <span class="cp">%}</span> +</pre></div> + + +<h2 id="_1">第二步:把那些字符串翻译成你要支持的语言。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2> +<h4 id="_2">为一种语言创建一个信息文件:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p>在三处之一运行如下命令: </p> +<ul> +<li> +<p>Django项目根目录。(首选)</p> +</li> +<li> +<p>您Django应用的根目录。</p> +</li> +<li> +<p>django 根目录(不是Subversion检出目录,而是通过 $PYTHONPATH 链接或位于该路径的某处)。 这仅和你为Django自己创建一个翻译时有关 <br /> +<code>django-admin.py makemessages -l zh</code></p> +</li> +</ul> +<h4 id="po">在po文件里进行翻译并保存<a class="headerlink" href="#po" title="Permanent link">&para;</a></h4> +<h4 id="_3">编译信息文件<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4> +<p>在你运行<code>django-admin.py makemessages</code>的目录下运行: <br /> +<code>django-admin.py compilemessages</code></p> +<h2 id="django-settings">第三步:在你的Django settings文件中激活本地中间件。<a class="headerlink" href="#django-settings" title="Permanent link">&para;</a></h2> +<p>在 MIDDLEWARE_CLASSES 设置中增加 'django.middleware.locale.LocaleMiddleware' 。 <br /> + 中间件的顺序是有影响的,最好按照依照以下要求: </p> +<ul> +<li> +<p>保证它是第一批安装的中间件类。 </p> +</li> +<li> +<p>因为 LocalMiddleware 要用到session数据,所以需要放在 SessionMiddleware 之后。</p> +</li> +<li> +<p>如果你使用CacheMiddleware,把LocaleMiddleware放在它后面。 +如下:</p> +</li> +</ul> +<div class="highlight"><pre><span class="n">MIDDLEWARE_CLASSES</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sessions</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">SessionMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">locale</span><span class="p">.</span><span class="n">LocaleMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">common</span><span class="p">.</span><span class="n">CommonMiddleware</span><span class="err">&#39;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div>Django 数据查询2014-09-07T00:00:00+08:00Wontag:wbowam.github.io,2014-09-07:django-shu-ju-cha-xun.html<div class="highlight"><pre><span class="n">class</span> <span class="n">Poll</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">slug</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">SlugField</span><span class="p">(</span><span class="n">unique_for_month</span><span class="o">=</span><span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">question</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">maxlength</span><span class="o">=</span><span class="mi">255</span><span class="p">)</span> + <span class="n">pub_date</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">DateTimeField</span><span class="p">()</span> + <span class="n">expire_date</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">DateTimeField</span><span class="p">()</span> + + <span class="n">def</span> <span class="n">__repr__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">question</span> + + <span class="n">class</span> <span class="n">Meta</span><span class="o">:</span> + <span class="n">get_latest_by</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span> + + + + + +<span class="n">class</span> <span class="n">Choice</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">poll</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">Poll</span><span class="p">,</span> <span class="n">edit_inline</span><span class="o">=</span><span class="n">models</span><span class="p">.</span><span class="n">TABULAR</span><span class="p">,</span> + <span class="n">num_in_admin</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">min_num_in_admin</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span> + <span class="n">choice</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">maxlength</span><span class="o">=</span><span class="mi">255</span><span class="p">,</span> <span class="n">core</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + <span class="n">votes</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">editable</span><span class="o">=</span><span class="n">False</span><span class="p">,</span> <span class="k">default</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + + <span class="n">def</span> <span class="n">__repr__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">choice</span> +</pre></div> + + +<h3 id="p1">获得一个数据对象p1<a class="headerlink" href="#p1" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">from</span> <span class="n">datetime</span> <span class="n">import</span> <span class="n">datetime</span> +<span class="n">p1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span>\ + <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="n">p1</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +</pre></div> + + +<ul> +<li>数据对象有一个初始方法save()</li> +</ul> +<h3 id="_1">获取结果集对象<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<h4 id="p2">无限制获取对象集p2<a class="headerlink" href="#p2" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">p2</span><span class="o">=</span><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">p2</span> +<span class="p">[</span><span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">up</span><span class="o">?</span><span class="p">,</span> <span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">your</span> <span class="n">name</span><span class="o">?</span><span class="p">]</span> +</pre></div> + + +<h6 id="p2_1">注意:在这里p2是个对象集,自身也是个对象。<a class="headerlink" href="#p2_1" title="Permanent link">&para;</a></h6> +<h4 id="_2">增加一些限制条件直到描述的子集满足你的需要。<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p>最常用的两个定制结果集的方法是:</p> +<div class="highlight"><pre><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> +<span class="err">返回一个匹配查询参数的新的结果集</span><span class="p">.</span> +<span class="n">exclude</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> +<span class="err">返回一个不匹配查询参数的新的结果集</span><span class="p">.</span> +</pre></div> + + +<p>这两个方法的返回值都是结果集对象,因此结果集可以进行链式处理:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;What&quot;</span><span class="p">)</span>\ + <span class="p">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span>\ + <span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span> +</pre></div> + + +<p>以一个初始结果集作为参数, 然后进行过滤, 再进行排除, 再进行另一个过滤. <br /> +这样得到的最终结果就一个问题开头单词是 "What", 发布日期在 2005年1月1日至今的所有民意测验的集合. </p> +<p>每个结果集都是一个独一无二的对象. 以上操作的每一步都生成了一个新的结果集: </p> +<div class="highlight"><pre><span class="n">q1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;What&quot;</span><span class="p">)</span> +<span class="n">q2</span> <span class="o">=</span> <span class="n">q1</span><span class="p">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +<span class="n">q3</span> <span class="o">=</span> <span class="n">q1</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +</pre></div> + + +<p>这三步生成了三个结果集; 一个初始结果集包含所有的以"What"开头的民意测验, 两个初始结果集的子集(一个排除条件,一个过滤条件). <br /> +对原始结果集的改进过程并没有影响到原始的结果集.</p> +<h6 id="_3">值得注意的是结果集的创建根本没有访问数据库.只有当对结果集取值时才会访问数据库.<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h6> +<h3 id="_4">字段查询<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<p>以 field__lookuptype (注意是双下线)形式进行基本的字段查询,举例来说:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__lte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +</pre></div> + + +<p>该查询翻译成SQL就是:</p> +<div class="highlight"><pre><span class="n">SELECT</span> <span class="o">*</span> <span class="n">FROM</span> <span class="n">polls_polls</span> <span class="n">WHERE</span> <span class="n">pub_date</span> <span class="o">&lt;=</span> <span class="n">NOW</span><span class="p">();</span> +</pre></div> + + +<h3 id="db-api">DB API 支持下列查找类型:<a class="headerlink" href="#db-api" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="err">类型</span> <span class="err">描述</span> +<span class="n">exact</span> <span class="err">精确匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">14</span><span class="p">).</span> +<span class="n">iexact</span> <span class="err">忽略大小写的精确匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">slug__iexact</span><span class="o">=</span><span class="s">&quot;foo&quot;</span><span class="p">)</span> <span class="err">匹配</span> <span class="n">foo</span><span class="p">,</span> <span class="n">FOO</span><span class="p">,</span> <span class="n">fOo</span><span class="p">,</span> <span class="err">等等</span><span class="p">.</span> +<span class="n">contains</span> <span class="err">大小写敏感的内容包含测试</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__contains</span><span class="o">=</span><span class="s">&quot;spam&quot;</span><span class="p">)</span> <span class="err">返回</span><span class="n">question</span> <span class="err">中包含</span> <span class="s">&quot;spam&quot;</span> <span class="err">的所有民意测验</span><span class="p">.(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span> <span class="n">MySQL</span><span class="err">支持</span><span class="p">.</span> <span class="n">SQLite</span> <span class="err">的</span><span class="n">LIKE</span> <span class="err">语句不支持大小写敏感特性</span><span class="p">.</span> <span class="err">对</span><span class="n">Sqlite</span> <span class="err">来说</span><span class="p">,</span> <span class="n">contains</span> <span class="err">等于</span> <span class="n">icontains</span><span class="p">.)</span> +<span class="n">icontains</span> <span class="err">大小写不敏感的内容包含测试</span><span class="o">:</span> +<span class="n">gt</span> <span class="err">大于</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__gt</span><span class="o">=</span><span class="mi">4</span><span class="p">).</span> +<span class="n">gte</span> <span class="err">大于等于</span><span class="p">.</span> +<span class="n">lt</span> <span class="err">小于</span><span class="p">.</span> +<span class="n">lte</span> <span class="err">小于等于</span><span class="p">.</span> +<span class="n">ne</span> <span class="err">不等于</span><span class="p">.</span> +<span class="n">in</span> <span class="err">位于给定列表中</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__in</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">])</span> <span class="err">返回一个</span> <span class="n">polls</span> <span class="err">列表</span><span class="p">(</span><span class="n">ID</span> <span class="err">值分别是</span> <span class="mi">1</span><span class="err">或</span><span class="mi">3</span><span class="err">或</span><span class="mi">4</span><span class="p">).</span> +<span class="n">startswith</span> <span class="err">大小写敏感的</span> <span class="n">starts</span><span class="o">-</span><span class="n">with</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;Would&quot;</span><span class="p">).(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span><span class="n">MySQL</span><span class="err">支持</span><span class="p">.</span> <span class="n">SQLite</span> <span class="err">的</span><span class="n">LIKE</span> <span class="err">语句不支持大小写敏感特性</span><span class="p">.</span> <span class="err">对</span><span class="n">Sqlite</span> <span class="err">来说</span><span class="p">,</span><span class="err">``</span><span class="n">startswith</span><span class="err">``</span> <span class="err">等于</span> <span class="n">istartswith</span><span class="p">)</span> +<span class="n">endswith</span> <span class="err">大小写敏感的</span> <span class="n">ends</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> <span class="p">(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span> <span class="n">MySQL</span><span class="p">)</span> +<span class="n">istartswith</span> <span class="err">大小写不敏感的</span> <span class="n">starts</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> +<span class="n">iendswith</span> <span class="err">大小写不敏感的</span> <span class="n">ends</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> +<span class="n">range</span> <span class="err">范围测试</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__range</span><span class="o">=</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">))</span> <span class="err">返回</span> <span class="n">pub_date</span> <span class="err">位于</span> <span class="n">start_date</span> <span class="err">和</span> <span class="n">end_date</span> <span class="p">(</span><span class="err">包括</span><span class="p">)</span><span class="err">之间的所有民意测验</span> +<span class="n">year</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">年</span> <span class="err">匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">get_count</span><span class="p">(</span><span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">).</span> +<span class="n">month</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">月</span> <span class="err">匹配</span><span class="o">:</span> +<span class="n">day</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">日</span> <span class="err">匹配</span><span class="o">:</span> +<span class="n">isnull</span> <span class="n">True</span><span class="o">/</span><span class="n">False</span><span class="p">;</span> <span class="err">做</span> <span class="n">IF</span> <span class="nb">NULL</span><span class="o">/</span><span class="n">IF</span> <span class="n">NOT</span> <span class="nb">NULL</span> <span class="err">查询</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">expire_date__isnull</span><span class="o">=</span><span class="n">True</span><span class="p">).</span> +</pre></div> + + +<h6 id="exact">如果未提供查找类型, 系统就认为查找类型是 exact . 下面两个语句是等价的:<a class="headerlink" href="#exact" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">id</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span> +<span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span> +</pre></div> + + +<h5 id="and">查询允许多个条件参数, 逗号分隔的多个条件参数会被 "AND" 起来使用:<a class="headerlink" href="#and" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span> + <span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">,</span> + <span class="n">pub_date__month</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> + <span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;Would&quot;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<p>得到2005年1月公布的带有一个"Would"开头的问题的所有民意测验.</p> +<h5 id="pk-primary_key__exact">为了使用更加方便, 还提供有一个 pk 查找类型, 可以翻译成 (primary_key)__exact.<a class="headerlink" href="#pk-primary_key__exact" title="Permanent link">&para;</a></h5> +<p>在这个民意测试的例子里, 下面两个语句是等价的.:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +</pre></div> + + +<h5 id="pk">pk 也可以通过连接进行查询.<a class="headerlink" href="#pk" title="Permanent link">&para;</a></h5> +<p>在这个民意测试的例子里, 下面两个语句是等价的:</p> +<div class="highlight"><pre><span class="n">choices</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">poll__id__exact</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">choices</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">poll__pk</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +</pre></div> + + +<p>如果传递的关键字参数非法, 将引发 TypeError 异常.</p> +<h4 id="or">OR 查询<a class="headerlink" href="#or" title="Permanent link">&para;</a></h4> +<p>关键字参数查询的各个条件都是 "AND" 关系. 如果你需要一个复杂的查询(举例来说,你需要一个 OR 语句), 你需要使用 Q 对象. <br /> +Q 对象是 django.core.meta.Q 的实例, 用来装载一系列关键字参数. 这些关键字参数就象指定给 get() 和 filter() 函数的关键字参数一样. 举例来说:</p> +<div class="highlight"><pre><span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">What</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>Q 对象可以使用 &amp; 和 | 运算符进行组合. 当两个Q对象进行 &amp; 或 | 运算时,会生成一个新的Q对象.举例来说语句:</p> +<div class="highlight"><pre><span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">Who</span><span class="err">&#39;</span><span class="p">)</span> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">What</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>生成一个新的 Q 对象表示这两个 "question__startswith" 查询条件的 "OR" 关系. 等同于下面的 SQL WHERE 子句:</p> +<div class="highlight"><pre> <span class="n">WHERE</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">Who</span><span class="o">%</span><span class="err">&#39;</span> <span class="n">OR</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">What</span><span class="o">%</span><span class="err">&#39;</span> +</pre></div> + + +<p>查询函数可以接受一个或多个 Q 对象作为参数.如果提供有多个 Q 对象参数, 它们将被 "AND" 到一起. 举例来说:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span> +<span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">Who</span><span class="err">&#39;</span><span class="p">),</span> +<span class="n">Q</span><span class="p">(</span><span class="n">pub_date__exact</span><span class="o">=</span><span class="n">date</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">pub_date__exact</span><span class="o">=</span><span class="n">date</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> +<span class="p">)</span> +</pre></div> + + +<p>翻译成 SQL 就是这样:</p> +<div class="highlight"><pre><span class="n">SELECT</span> <span class="o">*</span> <span class="n">from</span> <span class="n">polls</span> <span class="n">WHERE</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">Who</span><span class="o">%</span><span class="err">&#39;</span> +<span class="n">AND</span> <span class="p">(</span><span class="n">pub_date</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2005</span><span class="o">-</span><span class="mo">05</span><span class="o">-</span><span class="mo">02</span><span class="err">&#39;</span> <span class="n">OR</span> <span class="n">pub_date</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2005</span><span class="o">-</span><span class="mo">05</span><span class="o">-</span><span class="mo">06</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h3 id="_5">从结果集中取值<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3> +<p>只有通过取值操作才能得到结果集包含的对象.取值操作可以通过迭代,切片,或其它专门的函数来实现. </p> +<h5 id="_6">一个结果集就是一个可迭代对象.<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h5> +<p>因此,可以通过一个循环来取出它的值:</p> +<div class="highlight"><pre><span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span><span class="o">:</span> +<span class="n">print</span> <span class="n">p</span> +</pre></div> + + +<p>将使用 Poll 对象的 <strong>repr</strong>() 方法打印出所有的 Poll 对象.</p> +<h5 id="_7">一个结果集也可以被切片, 使用数组符号操作:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">fifth_poll</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="mi">4</span><span class="p">]</span> +<span class="n">all_polls_but_the_first_two</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="mi">2</span><span class="o">:</span><span class="p">]</span> +<span class="n">every_second_poll</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="o">::</span><span class="mi">2</span><span class="p">]</span> +</pre></div> + + +<h6 id="-">结果集对象是惰性对象 - 也就是说,他们不是 真正的 包含他们表示对象的集合 (或列表).<a class="headerlink" href="#-" title="Permanent link">&para;</a></h6> +<h6 id="python-django">Python 的协议魔法让结果集看起来是一个可迭代,可切片的对象. 事实上在幕后, Django 使用了缓存技术..<a class="headerlink" href="#python-django" title="Permanent link">&para;</a></h6> +<p>如果你真的需要一个列表, 你可以强制对一个惰性对象取值:</p> +<div class="highlight"><pre><span class="n">querylist</span> <span class="o">=</span> <span class="n">list</span><span class="p">(</span><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">())</span> +</pre></div> + + +<p>不过,最好不要这么做,尤其当一个结果集相当大时. 由于 Django 要创建每一个对象的内存表示,这将占用相当大的内存.</p> +<h3 id="_8">结果集及其缓存行为<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h3> +<p>每个结果集都包含一个 cache. 对一个新创建的结果集来说, 缓存区是空的.当一个结果集第一次被取值, Django 会进行一次数据库查询,并将查询结果放入缓存中, 之后返回用户需要的数据. 后面的取值操作会使用缓存中的数据而不用再次访问数据库.</p> +<p>必须时刻记住:结果集具有缓存行为. 下面两行语句生成了两个临时的结果集,并进行了取值,之后舍弃:</p> +<div class="highlight"><pre><span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">Query</span> <span class="n">Set</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">Query</span> <span class="n">Set</span> <span class="n">again</span> +</pre></div> + + +<p>对一个小型的,低流量的站点来说,这不会造成严重问题. <br /> +不过,对一个高访问量的站点来说,它双倍增加了数据库服务器的负担. <br /> +另外,由于在两次操作之间可能有其它的用户增加或删除了投票,因此这两次操作得到结果可能并不相同.</p> +<h5 id="_9">要避免这个问题, 保存这个结果集并在后面重用该结果集:<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">queryset</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">queryset</span><span class="p">]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">query</span> <span class="n">set</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">queryset</span><span class="p">]</span> <span class="err">#</span> <span class="n">Re</span><span class="o">-</span><span class="n">use</span> <span class="n">the</span> <span class="n">cache</span> <span class="n">from</span> <span class="n">the</span> <span class="n">evaluation</span> +</pre></div> + + +<h3 id="_10">关系 (连接)<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h3> +<p>当你在 model 中定义了一个关系字段(也就是,一个ForeignKey, OneToOneField, 或 ManyToManyField).<br /> +Django 使用关系字段的名字为 model 的每个实例添加一个 描述符. <br /> +在访问对象或关联对象时, 这个描述符就象一个常规属性. <br /> +举例来说, mychoice.poll 会返回 Choice 实例对象关联的 Poll 对象.</p> +<p>通过下面的关系,连接可以以非显式的方式进行: <br /> +<code>choices.objects.filter(poll__slug="eggs")</code> <br /> +得到一个 Choice 对象列表, 这些对象关联的 Poll 对象的 slug 字段值为 eggs. 允许多级连接. </p> +<p>通过一个对象实例的便利函数(convenience functions)就可直接查询该对象的关联对象. 举例来说, 如果 p 是一个 Poll 实例, p.choice_set() 将返回所有关联的 Choice 对象列表. 聪明的读者会注意到它等价于 choices.objects.filter(poll__id=p.id), 只是更加清晰.</p> +<h4 id="one-to-one-relations">One-to-one relations<a class="headerlink" href="#one-to-one-relations" title="Permanent link">&para;</a></h4> +<h5 id="one-to-one-get_relatedobjectname">one-to-one 关系中的每个对象拥有一个 get_relatedobjectname() 方法.<a class="headerlink" href="#one-to-one-get_relatedobjectname" title="Permanent link">&para;</a></h5> +<p>举例来说:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Place</span><span class="p">(</span><span class="n">meta</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> +<span class="cp"># ...</span> + +<span class="n">class</span> <span class="n">Restaurant</span><span class="p">(</span><span class="n">meta</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> +<span class="cp"># ...</span> + <span class="n">the_place</span> <span class="o">=</span> <span class="n">meta</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">places</span><span class="p">.</span><span class="n">Place</span><span class="p">)</span> +</pre></div> + + +<p>在上面的例子里, 每个 Place 会自动拥有一个 get_restaurant() 方法, <br /> +且每个 Restaurant 会自动拥有一个 get_the_place() 方法.</p> +<h4 id="many-to-one-relations">Many-to-one relations<a class="headerlink" href="#many-to-one-relations" title="Permanent link">&para;</a></h4> +<p>在 many-to-one 关系中, 关联对象(Many)会自动拥有一个 get_relatedobject() 方法. <br /> +被关联的对象(one)会自动拥有 get_relatedobject(), get_relatedobject_list(), 和 get_relatedobject_count() 方法 (功能与模块级的 get_object(), filter(), 和 get_count() 相同).</p> +<p>在上面的民意测试例子里, 一个 Poll 对象 p 自动拥有下列方法:</p> +<div class="highlight"><pre><span class="n">p</span><span class="p">.</span><span class="n">get_choice</span><span class="p">()</span> +<span class="n">p</span><span class="p">.</span><span class="n">get_choice_list</span><span class="p">()</span> +<span class="n">p</span><span class="p">.</span><span class="n">get_choice_count</span><span class="p">()</span> +</pre></div> + + +<p>Choice 对象 c 则自动拥有下面的方法: +<code>c.get_poll()</code> </p> +<h4 id="many-to-many">Many-to-many 关系<a class="headerlink" href="#many-to-many" title="Permanent link">&para;</a></h4> +<p>Many-to-many 关系类似<code>Many-to-one relations</code>_, 它生成同样的方法集.例外的是关联对象的 get_relatedobject_list() 方法返回一个实例的列表而不是一个仅一个实例.因此,若 Poll 和 Choice 是 many-to-many 关系, choice.get_poll_list() 将返回一个列表. </p> +<h5 id="_11">专门的结果集<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h5> +<p>除 filter 和 exclude() 之外, Django 提供了一系列结果集处理方法, 修改结果的类型, 或修改 sql 查询在数据库执行的方式.</p> +<div class="highlight"><pre><span class="n">order_by</span><span class="p">(</span><span class="o">*</span><span class="n">fields</span><span class="p">)</span> +</pre></div> + + +<p>根据 model 中提供 ordering tuple, 结果集会被自动排序. 不过, 排序也可以通过 order_by 方法显式的进行:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">,</span> +<span class="n">pub_date__month</span><span class="o">=</span><span class="mi">1</span><span class="p">).</span><span class="n">order_by</span><span class="p">(</span><span class="err">&#39;</span><span class="o">-</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>结果集将按降序排列 pub_date, 然后按升序排列 question."-pub_date" 中的负号表示降序(递减).要取随机序,使用"?", 象下面这样:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">order_by</span><span class="o">=</span><span class="p">(</span><span class="sc">&#39;?&#39;</span><span class="p">)</span> +</pre></div> + + +<p>要按另一个表中的字段排序, 添加另一个表的名字和一个句点,象下面这样:</p> +<div class="highlight"><pre><span class="n">Choice</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">order_by</span><span class="o">=</span><span class="p">(</span><span class="err">&#39;</span><span class="n">Poll</span><span class="p">.</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">choice</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h3 id="valuesfields">values(*fields)<a class="headerlink" href="#valuesfields" title="Permanent link">&para;</a></h3> +<p>类似 filter(), 不过它返回一个字典的列表而不是 model 实例对象的列表. </p> +<p>它接受一个可选参数: fields, 这是一个字段名列表或tuple.如果你没有指定 fields, 每个字段都会返回. <br /> +否则就只返回你指定的字段名和值.这里有一个例子,使用上面定义的 Poll model</p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">from</span> <span class="n">datetime</span> <span class="n">import</span> <span class="n">datetime</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span> +<span class="p">...</span> <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p1</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p2</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s your name?&quot;</span><span class="p">,</span> +<span class="p">...</span> <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p2</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="p">[</span><span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">up</span><span class="o">?</span><span class="p">,</span> <span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">your</span> <span class="n">name</span><span class="o">?</span><span class="p">]</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">values</span><span class="p">()</span> +<span class="p">[{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="o">:</span> <span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="err">&#39;</span><span class="n">expire_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">)},</span> +<span class="p">{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="o">:</span> <span class="s">&quot;What&#39;s your name?&quot;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="err">&#39;</span><span class="n">expire_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">)}]</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">values</span><span class="p">(</span><span class="n">fields</span><span class="o">=</span><span class="p">[</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="p">])</span> +<span class="p">[{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">},</span> <span class="p">{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">}]</span> +</pre></div> + + +<h4 id="model-values">当你知道你要取得哪些字段的值时并且你不需要那些 model实例对象的功能时,使用 values() 函数.<a class="headerlink" href="#model-values" title="Permanent link">&para;</a></h4>Django Validators2014-09-07T00:00:00+08:00Wontag:wbowam.github.io,2014-09-07:django-validators.html<p>之前没用过Validators <br /> +这回入了门,用了一下,很爽~~ </p> +<hr /> +<p><a href="https://docs.djangoproject.com/en/dev/ref/validators/">Django Validators</a> </p> +<h5 id="djangovalidators">正如django文档所说:我们可以自己新建各种Validators,如:<a class="headerlink" href="#djangovalidators" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">exceptions</span> <span class="n">import</span> <span class="n">ValidationError</span> + +<span class="n">def</span> <span class="n">validate_even</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">:</span> + <span class="k">if</span> <span class="n">value</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="o">:</span> + <span class="n">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="err">&#39;</span><span class="o">%</span><span class="n">s</span> <span class="n">is</span> <span class="n">not</span> <span class="n">an</span> <span class="n">even</span> <span class="n">number</span><span class="err">&#39;</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span> +</pre></div> + + +<p>You can add this to a model field via the field’s validators argument: </p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> + +<span class="n">class</span> <span class="n">MyModel</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">even_field</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">validate_even</span><span class="p">])</span> +</pre></div> + + +<p>神奇点在于,django自动帮我们抓取‘值’当作参数传入我们的Validators(有点像让人讨厌的黑魔术,但不是~~) </p> +<h5 id="validatorsformmodelform">同一个Validators也可以用于form,因为model和form相应的机理是一样的<a class="headerlink" href="#validatorsformmodelform" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span> <span class="n">import</span> <span class="n">forms</span> + +<span class="n">class</span> <span class="n">MyForm</span><span class="p">(</span><span class="n">forms</span><span class="p">.</span><span class="n">Form</span><span class="p">)</span><span class="o">:</span> + <span class="n">even_field</span> <span class="o">=</span> <span class="n">forms</span><span class="p">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">validate_even</span><span class="p">])</span> +</pre></div> + + +<h3 id="validatorsbuilt-in-validators">不过,多数时候我们喜欢用内置的Validators,也就是官网说的<code>Built-in validators</code><a class="headerlink" href="#validatorsbuilt-in-validators" title="Permanent link">&para;</a></h3> +<p>用法如下:</p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">validators</span> <span class="n">import</span> <span class="n">MinLengthValidator</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> + +<span class="n">class</span> <span class="n">MyModel</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">even_field</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">TextField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">MinLengthValidator</span><span class="p">(</span><span class="mi">20</span><span class="p">)])</span> +</pre></div> + + +<p>以上所用<code>MinLengthValidator</code>网名生意:<code>max_length</code>的反意思。 <br /> +还有很多内置Validator,<a href="https://docs.djangoproject.com/en/dev/ref/validators/">看官网</a></p> +<h3 id="validator">假如我想改一下内置 Validator的错误提示,可以这么干:<a class="headerlink" href="#validator" title="Permanent link">&para;</a></h3> +<p>1.自己写一个子类,覆盖message</p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">validators</span> <span class="n">import</span> <span class="n">MinLengthValidator</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> + +<span class="n">class</span> <span class="n">MyMinLengthValidator</span><span class="p">(</span><span class="n">MinLengthValidator</span><span class="p">)</span><span class="o">:</span> + <span class="n">message</span> <span class="o">=</span> <span class="s">&quot;少年, 至少输入%(limit_value)d个字符 ,(你怎么只输入 %(show_value)d个字符就完事儿啊).&quot;</span> + +<span class="n">class</span> <span class="n">MyModel</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">even_field</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">TextField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">MinLengthValidator</span><span class="p">(</span><span class="mi">20</span><span class="p">)])</span> +</pre></div> + + +<ol> +<li>当然,这种方法很简单,很常见,不够高大上:填写<code>error_messages</code>选项</li> +</ol> +<div class="highlight"><pre><span class="p">....</span> +<span class="n">my_field</span> <span class="o">=</span> <span class="n">forms</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">MinLengthValidator</span><span class="p">(</span><span class="mi">8</span><span class="p">)],</span> + <span class="n">error_messages</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;min_length&quot;</span><span class="o">:</span><span class="s">&quot;少年, 至少输入%(limit_value)d个字符 ,(你怎么只输入 %(show_value)d个字符就完事儿啊).&quot;</span><span class="p">})</span> +<span class="p">})</span> +<span class="p">..</span> <span class="p">.</span> <span class="p">..</span> +</pre></div>I am just Testing2014-09-07T00:00:00+08:00Wontag:wbowam.github.io,2014-09-07:i-am-just-testing.html<div class="highlight"><pre><span class="n">class</span> <span class="n">Poll</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">slug</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">SlugField</span><span class="p">(</span><span class="n">unique_for_month</span><span class="o">=</span><span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">question</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">maxlength</span><span class="o">=</span><span class="mi">255</span><span class="p">)</span> + <span class="n">pub_date</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">DateTimeField</span><span class="p">()</span> + <span class="n">expire_date</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">DateTimeField</span><span class="p">()</span> + + <span class="n">def</span> <span class="n">__repr__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">question</span> + + <span class="n">class</span> <span class="n">Meta</span><span class="o">:</span> + <span class="n">get_latest_by</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span> + + + + + +<span class="n">class</span> <span class="n">Choice</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">poll</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">Poll</span><span class="p">,</span> <span class="n">edit_inline</span><span class="o">=</span><span class="n">models</span><span class="p">.</span><span class="n">TABULAR</span><span class="p">,</span> + <span class="n">num_in_admin</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">min_num_in_admin</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span> + <span class="n">choice</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">maxlength</span><span class="o">=</span><span class="mi">255</span><span class="p">,</span> <span class="n">core</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + <span class="n">votes</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">editable</span><span class="o">=</span><span class="n">False</span><span class="p">,</span> <span class="k">default</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + + <span class="n">def</span> <span class="n">__repr__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">choice</span> +</pre></div> + + +<h3 id="p1">获得一个数据对象p1<a class="headerlink" href="#p1" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">from</span> <span class="n">datetime</span> <span class="n">import</span> <span class="n">datetime</span> +<span class="n">p1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span>\ + <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="n">p1</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +</pre></div> + + +<ul> +<li>数据对象有一个初始方法save()</li> +</ul> +<h3 id="_1">获取结果集对象<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<h4 id="p2">无限制获取对象集p2<a class="headerlink" href="#p2" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">p2</span><span class="o">=</span><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">p2</span> +<span class="p">[</span><span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">up</span><span class="o">?</span><span class="p">,</span> <span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">your</span> <span class="n">name</span><span class="o">?</span><span class="p">]</span> +</pre></div> + + +<h6 id="p2_1">注意:在这里p2是个对象集,自身也是个对象。<a class="headerlink" href="#p2_1" title="Permanent link">&para;</a></h6> +<h4 id="_2">增加一些限制条件直到描述的子集满足你的需要。<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p>最常用的两个定制结果集的方法是:</p> +<div class="highlight"><pre><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> +<span class="err">返回一个匹配查询参数的新的结果集</span><span class="p">.</span> +<span class="n">exclude</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> +<span class="err">返回一个不匹配查询参数的新的结果集</span><span class="p">.</span> +</pre></div> + + +<p>这两个方法的返回值都是结果集对象,因此结果集可以进行链式处理:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;What&quot;</span><span class="p">)</span>\ + <span class="p">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span>\ + <span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span> +</pre></div> + + +<p>以一个初始结果集作为参数, 然后进行过滤, 再进行排除, 再进行另一个过滤. <br /> +这样得到的最终结果就一个问题开头单词是 "What", 发布日期在 2005年1月1日至今的所有民意测验的集合. </p> +<p>每个结果集都是一个独一无二的对象. 以上操作的每一步都生成了一个新的结果集: </p> +<div class="highlight"><pre><span class="n">q1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;What&quot;</span><span class="p">)</span> +<span class="n">q2</span> <span class="o">=</span> <span class="n">q1</span><span class="p">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +<span class="n">q3</span> <span class="o">=</span> <span class="n">q1</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +</pre></div> + + +<p>这三步生成了三个结果集; 一个初始结果集包含所有的以"What"开头的民意测验, 两个初始结果集的子集(一个排除条件,一个过滤条件). <br /> +对原始结果集的改进过程并没有影响到原始的结果集.</p> +<h6 id="_3">值得注意的是结果集的创建根本没有访问数据库.只有当对结果集取值时才会访问数据库.<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h6> +<h3 id="_4">字段查询<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<p>以 field__lookuptype (注意是双下线)形式进行基本的字段查询,举例来说:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__lte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +</pre></div> + + +<p>该查询翻译成SQL就是:</p> +<div class="highlight"><pre><span class="n">SELECT</span> <span class="o">*</span> <span class="n">FROM</span> <span class="n">polls_polls</span> <span class="n">WHERE</span> <span class="n">pub_date</span> <span class="o">&lt;=</span> <span class="n">NOW</span><span class="p">();</span> +</pre></div> + + +<h3 id="db-api">DB API 支持下列查找类型:<a class="headerlink" href="#db-api" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="err">类型</span> <span class="err">描述</span> +<span class="n">exact</span> <span class="err">精确匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">14</span><span class="p">).</span> +<span class="n">iexact</span> <span class="err">忽略大小写的精确匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">slug__iexact</span><span class="o">=</span><span class="s">&quot;foo&quot;</span><span class="p">)</span> <span class="err">匹配</span> <span class="n">foo</span><span class="p">,</span> <span class="n">FOO</span><span class="p">,</span> <span class="n">fOo</span><span class="p">,</span> <span class="err">等等</span><span class="p">.</span> +<span class="n">contains</span> <span class="err">大小写敏感的内容包含测试</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__contains</span><span class="o">=</span><span class="s">&quot;spam&quot;</span><span class="p">)</span> <span class="err">返回</span><span class="n">question</span> <span class="err">中包含</span> <span class="s">&quot;spam&quot;</span> <span class="err">的所有民意测验</span><span class="p">.(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span> <span class="n">MySQL</span><span class="err">支持</span><span class="p">.</span> <span class="n">SQLite</span> <span class="err">的</span><span class="n">LIKE</span> <span class="err">语句不支持大小写敏感特性</span><span class="p">.</span> <span class="err">对</span><span class="n">Sqlite</span> <span class="err">来说</span><span class="p">,</span> <span class="n">contains</span> <span class="err">等于</span> <span class="n">icontains</span><span class="p">.)</span> +<span class="n">icontains</span> <span class="err">大小写不敏感的内容包含测试</span><span class="o">:</span> +<span class="n">gt</span> <span class="err">大于</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__gt</span><span class="o">=</span><span class="mi">4</span><span class="p">).</span> +<span class="n">gte</span> <span class="err">大于等于</span><span class="p">.</span> +<span class="n">lt</span> <span class="err">小于</span><span class="p">.</span> +<span class="n">lte</span> <span class="err">小于等于</span><span class="p">.</span> +<span class="n">ne</span> <span class="err">不等于</span><span class="p">.</span> +<span class="n">in</span> <span class="err">位于给定列表中</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__in</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">])</span> <span class="err">返回一个</span> <span class="n">polls</span> <span class="err">列表</span><span class="p">(</span><span class="n">ID</span> <span class="err">值分别是</span> <span class="mi">1</span><span class="err">或</span><span class="mi">3</span><span class="err">或</span><span class="mi">4</span><span class="p">).</span> +<span class="n">startswith</span> <span class="err">大小写敏感的</span> <span class="n">starts</span><span class="o">-</span><span class="n">with</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;Would&quot;</span><span class="p">).(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span><span class="n">MySQL</span><span class="err">支持</span><span class="p">.</span> <span class="n">SQLite</span> <span class="err">的</span><span class="n">LIKE</span> <span class="err">语句不支持大小写敏感特性</span><span class="p">.</span> <span class="err">对</span><span class="n">Sqlite</span> <span class="err">来说</span><span class="p">,</span><span class="err">``</span><span class="n">startswith</span><span class="err">``</span> <span class="err">等于</span> <span class="n">istartswith</span><span class="p">)</span> +<span class="n">endswith</span> <span class="err">大小写敏感的</span> <span class="n">ends</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> <span class="p">(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span> <span class="n">MySQL</span><span class="p">)</span> +<span class="n">istartswith</span> <span class="err">大小写不敏感的</span> <span class="n">starts</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> +<span class="n">iendswith</span> <span class="err">大小写不敏感的</span> <span class="n">ends</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> +<span class="n">range</span> <span class="err">范围测试</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__range</span><span class="o">=</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">))</span> <span class="err">返回</span> <span class="n">pub_date</span> <span class="err">位于</span> <span class="n">start_date</span> <span class="err">和</span> <span class="n">end_date</span> <span class="p">(</span><span class="err">包括</span><span class="p">)</span><span class="err">之间的所有民意测验</span> +<span class="n">year</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">年</span> <span class="err">匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">get_count</span><span class="p">(</span><span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">).</span> +<span class="n">month</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">月</span> <span class="err">匹配</span><span class="o">:</span> +<span class="n">day</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">日</span> <span class="err">匹配</span><span class="o">:</span> +<span class="n">isnull</span> <span class="n">True</span><span class="o">/</span><span class="n">False</span><span class="p">;</span> <span class="err">做</span> <span class="n">IF</span> <span class="nb">NULL</span><span class="o">/</span><span class="n">IF</span> <span class="n">NOT</span> <span class="nb">NULL</span> <span class="err">查询</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">expire_date__isnull</span><span class="o">=</span><span class="n">True</span><span class="p">).</span> +</pre></div> + + +<h6 id="exact">如果未提供查找类型, 系统就认为查找类型是 exact . 下面两个语句是等价的:<a class="headerlink" href="#exact" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">id</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span> +<span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span> +</pre></div> + + +<h5 id="and">查询允许多个条件参数, 逗号分隔的多个条件参数会被 "AND" 起来使用:<a class="headerlink" href="#and" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span> + <span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">,</span> + <span class="n">pub_date__month</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> + <span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;Would&quot;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<p>得到2005年1月公布的带有一个"Would"开头的问题的所有民意测验.</p> +<h5 id="pk-primary_key__exact">为了使用更加方便, 还提供有一个 pk 查找类型, 可以翻译成 (primary_key)__exact.<a class="headerlink" href="#pk-primary_key__exact" title="Permanent link">&para;</a></h5> +<p>在这个民意测试的例子里, 下面两个语句是等价的.:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +</pre></div> + + +<h5 id="pk">pk 也可以通过连接进行查询.<a class="headerlink" href="#pk" title="Permanent link">&para;</a></h5> +<p>在这个民意测试的例子里, 下面两个语句是等价的:</p> +<div class="highlight"><pre><span class="n">choices</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">poll__id__exact</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">choices</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">poll__pk</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +</pre></div> + + +<p>如果传递的关键字参数非法, 将引发 TypeError 异常.</p> +<h4 id="or">OR 查询<a class="headerlink" href="#or" title="Permanent link">&para;</a></h4> +<p>关键字参数查询的各个条件都是 "AND" 关系. 如果你需要一个复杂的查询(举例来说,你需要一个 OR 语句), 你需要使用 Q 对象. <br /> +Q 对象是 django.core.meta.Q 的实例, 用来装载一系列关键字参数. 这些关键字参数就象指定给 get() 和 filter() 函数的关键字参数一样. 举例来说:</p> +<div class="highlight"><pre><span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">What</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>Q 对象可以使用 &amp; 和 | 运算符进行组合. 当两个Q对象进行 &amp; 或 | 运算时,会生成一个新的Q对象.举例来说语句:</p> +<div class="highlight"><pre><span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">Who</span><span class="err">&#39;</span><span class="p">)</span> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">What</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>生成一个新的 Q 对象表示这两个 "question__startswith" 查询条件的 "OR" 关系. 等同于下面的 SQL WHERE 子句:</p> +<div class="highlight"><pre> <span class="n">WHERE</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">Who</span><span class="o">%</span><span class="err">&#39;</span> <span class="n">OR</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">What</span><span class="o">%</span><span class="err">&#39;</span> +</pre></div> + + +<p>查询函数可以接受一个或多个 Q 对象作为参数.如果提供有多个 Q 对象参数, 它们将被 "AND" 到一起. 举例来说:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span> +<span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">Who</span><span class="err">&#39;</span><span class="p">),</span> +<span class="n">Q</span><span class="p">(</span><span class="n">pub_date__exact</span><span class="o">=</span><span class="n">date</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">pub_date__exact</span><span class="o">=</span><span class="n">date</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> +<span class="p">)</span> +</pre></div> + + +<p>翻译成 SQL 就是这样:</p> +<div class="highlight"><pre><span class="n">SELECT</span> <span class="o">*</span> <span class="n">from</span> <span class="n">polls</span> <span class="n">WHERE</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">Who</span><span class="o">%</span><span class="err">&#39;</span> +<span class="n">AND</span> <span class="p">(</span><span class="n">pub_date</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2005</span><span class="o">-</span><span class="mo">05</span><span class="o">-</span><span class="mo">02</span><span class="err">&#39;</span> <span class="n">OR</span> <span class="n">pub_date</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2005</span><span class="o">-</span><span class="mo">05</span><span class="o">-</span><span class="mo">06</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h3 id="_5">从结果集中取值<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3> +<p>只有通过取值操作才能得到结果集包含的对象.取值操作可以通过迭代,切片,或其它专门的函数来实现. </p> +<h5 id="_6">一个结果集就是一个可迭代对象.<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h5> +<p>因此,可以通过一个循环来取出它的值:</p> +<div class="highlight"><pre><span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span><span class="o">:</span> +<span class="n">print</span> <span class="n">p</span> +</pre></div> + + +<p>将使用 Poll 对象的 <strong>repr</strong>() 方法打印出所有的 Poll 对象.</p> +<h5 id="_7">一个结果集也可以被切片, 使用数组符号操作:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">fifth_poll</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="mi">4</span><span class="p">]</span> +<span class="n">all_polls_but_the_first_two</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="mi">2</span><span class="o">:</span><span class="p">]</span> +<span class="n">every_second_poll</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="o">::</span><span class="mi">2</span><span class="p">]</span> +</pre></div> + + +<h6 id="-">结果集对象是惰性对象 - 也就是说,他们不是 真正的 包含他们表示对象的集合 (或列表).<a class="headerlink" href="#-" title="Permanent link">&para;</a></h6> +<h6 id="python-django">Python 的协议魔法让结果集看起来是一个可迭代,可切片的对象. 事实上在幕后, Django 使用了缓存技术..<a class="headerlink" href="#python-django" title="Permanent link">&para;</a></h6> +<p>如果你真的需要一个列表, 你可以强制对一个惰性对象取值:</p> +<div class="highlight"><pre><span class="n">querylist</span> <span class="o">=</span> <span class="n">list</span><span class="p">(</span><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">())</span> +</pre></div> + + +<p>不过,最好不要这么做,尤其当一个结果集相当大时. 由于 Django 要创建每一个对象的内存表示,这将占用相当大的内存.</p> +<h3 id="_8">结果集及其缓存行为<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h3> +<p>每个结果集都包含一个 cache. 对一个新创建的结果集来说, 缓存区是空的.当一个结果集第一次被取值, Django 会进行一次数据库查询,并将查询结果放入缓存中, 之后返回用户需要的数据. 后面的取值操作会使用缓存中的数据而不用再次访问数据库.</p> +<p>必须时刻记住:结果集具有缓存行为. 下面两行语句生成了两个临时的结果集,并进行了取值,之后舍弃:</p> +<div class="highlight"><pre><span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">Query</span> <span class="n">Set</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">Query</span> <span class="n">Set</span> <span class="n">again</span> +</pre></div> + + +<p>对一个小型的,低流量的站点来说,这不会造成严重问题. <br /> +不过,对一个高访问量的站点来说,它双倍增加了数据库服务器的负担. <br /> +另外,由于在两次操作之间可能有其它的用户增加或删除了投票,因此这两次操作得到结果可能并不相同.</p> +<h5 id="_9">要避免这个问题, 保存这个结果集并在后面重用该结果集:<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">queryset</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">queryset</span><span class="p">]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">query</span> <span class="n">set</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">queryset</span><span class="p">]</span> <span class="err">#</span> <span class="n">Re</span><span class="o">-</span><span class="n">use</span> <span class="n">the</span> <span class="n">cache</span> <span class="n">from</span> <span class="n">the</span> <span class="n">evaluation</span> +</pre></div> + + +<h3 id="_10">关系 (连接)<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h3> +<p>当你在 model 中定义了一个关系字段(也就是,一个ForeignKey, OneToOneField, 或 ManyToManyField).<br /> +Django 使用关系字段的名字为 model 的每个实例添加一个 描述符. <br /> +在访问对象或关联对象时, 这个描述符就象一个常规属性. <br /> +举例来说, mychoice.poll 会返回 Choice 实例对象关联的 Poll 对象.</p> +<p>通过下面的关系,连接可以以非显式的方式进行: <br /> +<code>choices.objects.filter(poll__slug="eggs")</code> <br /> +得到一个 Choice 对象列表, 这些对象关联的 Poll 对象的 slug 字段值为 eggs. 允许多级连接. </p> +<p>通过一个对象实例的便利函数(convenience functions)就可直接查询该对象的关联对象. 举例来说, 如果 p 是一个 Poll 实例, p.choice_set() 将返回所有关联的 Choice 对象列表. 聪明的读者会注意到它等价于 choices.objects.filter(poll__id=p.id), 只是更加清晰.</p> +<h4 id="one-to-one-relations">One-to-one relations<a class="headerlink" href="#one-to-one-relations" title="Permanent link">&para;</a></h4> +<h5 id="one-to-one-get_relatedobjectname">one-to-one 关系中的每个对象拥有一个 get_relatedobjectname() 方法.<a class="headerlink" href="#one-to-one-get_relatedobjectname" title="Permanent link">&para;</a></h5> +<p>举例来说:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Place</span><span class="p">(</span><span class="n">meta</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> +<span class="cp"># ...</span> + +<span class="n">class</span> <span class="n">Restaurant</span><span class="p">(</span><span class="n">meta</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> +<span class="cp"># ...</span> + <span class="n">the_place</span> <span class="o">=</span> <span class="n">meta</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">places</span><span class="p">.</span><span class="n">Place</span><span class="p">)</span> +</pre></div> + + +<p>在上面的例子里, 每个 Place 会自动拥有一个 get_restaurant() 方法, <br /> +且每个 Restaurant 会自动拥有一个 get_the_place() 方法.</p> +<h4 id="many-to-one-relations">Many-to-one relations<a class="headerlink" href="#many-to-one-relations" title="Permanent link">&para;</a></h4> +<p>在 many-to-one 关系中, 关联对象(Many)会自动拥有一个 get_relatedobject() 方法. <br /> +被关联的对象(one)会自动拥有 get_relatedobject(), get_relatedobject_list(), 和 get_relatedobject_count() 方法 (功能与模块级的 get_object(), filter(), 和 get_count() 相同).</p> +<p>在上面的民意测试例子里, 一个 Poll 对象 p 自动拥有下列方法:</p> +<div class="highlight"><pre><span class="n">p</span><span class="p">.</span><span class="n">get_choice</span><span class="p">()</span> +<span class="n">p</span><span class="p">.</span><span class="n">get_choice_list</span><span class="p">()</span> +<span class="n">p</span><span class="p">.</span><span class="n">get_choice_count</span><span class="p">()</span> +</pre></div> + + +<p>Choice 对象 c 则自动拥有下面的方法: +<code>c.get_poll()</code> </p> +<h4 id="many-to-many">Many-to-many 关系<a class="headerlink" href="#many-to-many" title="Permanent link">&para;</a></h4> +<p>Many-to-many 关系类似<code>Many-to-one relations</code>_, 它生成同样的方法集.例外的是关联对象的 get_relatedobject_list() 方法返回一个实例的列表而不是一个仅一个实例.因此,若 Poll 和 Choice 是 many-to-many 关系, choice.get_poll_list() 将返回一个列表. </p> +<h5 id="_11">专门的结果集<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h5> +<p>除 filter 和 exclude() 之外, Django 提供了一系列结果集处理方法, 修改结果的类型, 或修改 sql 查询在数据库执行的方式.</p> +<div class="highlight"><pre><span class="n">order_by</span><span class="p">(</span><span class="o">*</span><span class="n">fields</span><span class="p">)</span> +</pre></div> + + +<p>根据 model 中提供 ordering tuple, 结果集会被自动排序. 不过, 排序也可以通过 order_by 方法显式的进行:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">,</span> +<span class="n">pub_date__month</span><span class="o">=</span><span class="mi">1</span><span class="p">).</span><span class="n">order_by</span><span class="p">(</span><span class="err">&#39;</span><span class="o">-</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>结果集将按降序排列 pub_date, 然后按升序排列 question."-pub_date" 中的负号表示降序(递减).要取随机序,使用"?", 象下面这样:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">order_by</span><span class="o">=</span><span class="p">(</span><span class="sc">&#39;?&#39;</span><span class="p">)</span> +</pre></div> + + +<p>要按另一个表中的字段排序, 添加另一个表的名字和一个句点,象下面这样:</p> +<div class="highlight"><pre><span class="n">Choice</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">order_by</span><span class="o">=</span><span class="p">(</span><span class="err">&#39;</span><span class="n">Poll</span><span class="p">.</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">choice</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h3 id="valuesfields">values(*fields)<a class="headerlink" href="#valuesfields" title="Permanent link">&para;</a></h3> +<p>类似 filter(), 不过它返回一个字典的列表而不是 model 实例对象的列表. </p> +<p>它接受一个可选参数: fields, 这是一个字段名列表或tuple.如果你没有指定 fields, 每个字段都会返回. <br /> +否则就只返回你指定的字段名和值.这里有一个例子,使用上面定义的 Poll model</p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">from</span> <span class="n">datetime</span> <span class="n">import</span> <span class="n">datetime</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span> +<span class="p">...</span> <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p1</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p2</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s your name?&quot;</span><span class="p">,</span> +<span class="p">...</span> <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p2</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="p">[</span><span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">up</span><span class="o">?</span><span class="p">,</span> <span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">your</span> <span class="n">name</span><span class="o">?</span><span class="p">]</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">values</span><span class="p">()</span> +<span class="p">[{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="o">:</span> <span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="err">&#39;</span><span class="n">expire_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">)},</span> +<span class="p">{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="o">:</span> <span class="s">&quot;What&#39;s your name?&quot;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="err">&#39;</span><span class="n">expire_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">)}]</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">values</span><span class="p">(</span><span class="n">fields</span><span class="o">=</span><span class="p">[</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="p">])</span> +<span class="p">[{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">},</span> <span class="p">{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">}]</span> +</pre></div> + + +<h4 id="model-values">当你知道你要取得哪些字段的值时并且你不需要那些 model实例对象的功能时,使用 values() 函数.<a class="headerlink" href="#model-values" title="Permanent link">&para;</a></h4>related Field has invalid lookup: icontains 解决方法2014-09-07T00:00:00+08:00Wontag:wbowam.github.io,2014-09-07:related-field-has-invalid-lookup-icontains-jie-jue-fang-fa.html<p>这种错误常见于: </p> +<h5 id="1">1. 后台查询部分,如:<a class="headerlink" href="#1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="cp"># 有一个表Category是表Article的category外键,Category有属性叫name,</span> +<span class="n">class</span> <span class="n">ArticleAdmin</span><span class="p">(</span><span class="n">admin</span><span class="p">.</span><span class="n">ModelAdmin</span><span class="p">)</span><span class="o">:</span> + + <span class="s">&quot;&quot;&quot;</span> + <span class="n">A</span> <span class="n">simple</span> <span class="n">AdminModel</span> <span class="k">for</span> <span class="n">Article</span><span class="p">.</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="n">search_fields</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">category</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>以上情况下肯定会报一个<code>related Field has invalid lookup: icontains</code>错误 </p> +<h5 id="2">2. 你在其他地方写了查询语句,如以下函数:<a class="headerlink" href="#2" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="err">@</span><span class="n">classmethod</span> + <span class="n">def</span> <span class="n">get_articles</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">CATEGORY</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">TAG</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">NUM</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span><span class="o">:</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="n">A</span> <span class="n">simple</span> <span class="n">classmethod</span><span class="p">.</span> + <span class="n">Use</span> <span class="n">Article</span><span class="p">.</span><span class="n">get_articles</span><span class="p">(</span><span class="n">CATEGORY</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">TAG</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">NUM</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span> <span class="n">to</span> <span class="n">get</span> <span class="n">articles</span> <span class="n">list</span><span class="p">.</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="k">if</span> <span class="n">CATEGORY</span><span class="o">:</span> + <span class="n">article_list</span> <span class="o">=</span> <span class="n">cls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span> + <span class="n">Q</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">Q</span><span class="p">(</span><span class="n">category__icontains</span><span class="o">=</span><span class="n">CATEGORY</span><span class="p">))[</span><span class="o">:</span><span class="n">NUM</span><span class="p">]</span> + <span class="k">return</span> <span class="n">article_list</span> + <span class="k">return</span> <span class="n">cls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">0</span><span class="p">)[</span><span class="o">:</span><span class="n">NUM</span><span class="p">]</span> +</pre></div> + + +<p>如上第二个Q查询里。</p> +<h4 id="_1">以上两种情况原因都是一样的:设置搜索范围,如果有外键,要注明外键的哪个字段,双下划线。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">class</span> <span class="n">ArticleAdmin</span><span class="p">(</span><span class="n">admin</span><span class="p">.</span><span class="n">ModelAdmin</span><span class="p">)</span><span class="o">:</span> + + <span class="s">&quot;&quot;&quot;</span> + <span class="n">A</span> <span class="n">simple</span> <span class="n">AdminModel</span> <span class="k">for</span> <span class="n">Article</span><span class="p">.</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="n">search_fields</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">category__name</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<div class="highlight"><pre><span class="err">@</span><span class="n">classmethod</span> + <span class="n">def</span> <span class="n">get_articles</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">CATEGORY</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">TAG</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">NUM</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span><span class="o">:</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="n">A</span> <span class="n">simple</span> <span class="n">classmethod</span><span class="p">.</span> + <span class="n">Use</span> <span class="n">Article</span><span class="p">.</span><span class="n">get_articles</span><span class="p">(</span><span class="n">CATEGORY</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">TAG</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">NUM</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span> <span class="n">to</span> <span class="n">get</span> <span class="n">articles</span> <span class="n">list</span><span class="p">.</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="k">if</span> <span class="n">CATEGORY</span><span class="o">:</span> + <span class="n">article_list</span> <span class="o">=</span> <span class="n">cls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span> + <span class="n">Q</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">Q</span><span class="p">(</span><span class="n">category__name__icontains</span><span class="o">=</span><span class="n">CATEGORY</span><span class="p">))[</span><span class="o">:</span><span class="n">NUM</span><span class="p">]</span> + <span class="k">return</span> <span class="n">article_list</span> + <span class="k">return</span> <span class="n">cls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">0</span><span class="p">)[</span><span class="o">:</span><span class="n">NUM</span><span class="p">]</span> +</pre></div>试用 Django 1.72014-09-07T00:00:00+08:00Wontag:wbowam.github.io,2014-09-07:shi-yong-django-17.html<p>首先感谢django团队,在这一版本里django自身提供了数据迁移功能——migration</p> +<h3 id="_1">数据迁移<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>修改Model后可以在不影响现有数据的前提下重建表结构。 </p> +<h6 id="southsouthdjango">以往的解决方案是South(于是South成为了django必备的,最受欢迎的应用。)<a class="headerlink" href="#southsouthdjango" title="Permanent link">&para;</a></h6> +<h4 id="_2">原理<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p>django的migration功能,类似与South的migration功能。 </p> +<h5 id="app">首先,创建app:<a class="headerlink" href="#app" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">startapp</span> <span class="n">myblog</span> +<span class="cp">##1.7版django这一步时会创建一个migrations/目录</span> +</pre></div> + + +<div class="highlight"><pre><span class="cp">##settings.py</span> +<span class="n">INSTALLED_APPS</span> <span class="o">=</span><span class="p">(</span> + <span class="err">####</span> + <span class="err">&#39;</span><span class="n">myblog</span><span class="err">&#39;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<div class="highlight"><pre><span class="cp">##models.py</span> +<span class="n">class</span> <span class="n">Article</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> +</pre></div> + + +<h5 id="_3">生成数据表<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h5> +<p>(不再有syncdb) </p> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">makemigrations</span> <span class="n">myblog</span> +</pre></div> + + +<p>运行结果如下</p> +<div class="highlight"><pre><span class="n">Migrations</span> <span class="k">for</span> <span class="err">‘</span><span class="n">myblog</span><span class="err">’</span><span class="o">:</span> + <span class="mo">0001</span><span class="n">_initial</span><span class="p">.</span><span class="n">py</span><span class="o">:</span> + <span class="o">-</span> <span class="n">Create</span> <span class="n">model</span> <span class="n">Article</span> +</pre></div> + + +<p>看看生成了哪些文件</p> +<div class="highlight"><pre><span class="n">ls</span> <span class="n">myblog</span><span class="o">/</span><span class="n">migrations</span><span class="o">/</span> +<span class="n">__init__</span><span class="p">.</span><span class="n">py</span> <span class="mo">0001</span><span class="n">_initial</span><span class="p">.</span><span class="n">py</span> +</pre></div> + + +<h4 id="modelsauthor">修改models,添加一个author属性<a class="headerlink" href="#modelsauthor" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Article</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + <span class="n">author</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> +</pre></div> + + +<h5 id="_4">生成数据表(修改后)<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">makemigrations</span> <span class="n">myblog</span> +<span class="cp">##运行结果</span> +<span class="n">Migrations</span> <span class="k">for</span> <span class="err">‘</span><span class="n">myblog</span><span class="err">’</span><span class="o">:</span> + <span class="mo">0002</span><span class="n">_article_author</span><span class="p">.</span><span class="n">py</span><span class="o">:</span> + <span class="o">-</span> <span class="n">Add</span> <span class="n">field</span> <span class="n">author</span> <span class="n">to</span> <span class="n">article</span> +</pre></div> + + +<p>我们来看看他重新生成数据表时干了些什么 +<em> 从上一个migration中获取之前的Model列表,写到set中. +</em> 获取现有的model列表,写入set中。 +* 遍历这两个set的差集,获取差集Model中所有的field,如果field的定义相同,就询问用户是否是一个rename的model,否则视为创建。</p> +<h4 id="migrate">数据迁移(migrate)<a class="headerlink" href="#migrate" title="Permanent link">&para;</a></h4> +<p><code>python manage.py migrate myblog</code> </p> +<hr /> +<p>That's all +以上是个人对migration的理解,求纠错和指点~~</p>Ubuntu 12.04中文输入法的安装2014-08-21T00:00:00+08:00Wontag:wbowam.github.io,2014-08-21:ubuntu-1204zhong-wen-shu-ru-fa-de-an-zhuang.html<p>Ubuntu上的输入法主要有小小输入平台(支持拼音/二笔/五笔等),Fcitx,Ibus,Scim等。 <br /> +其中Scim和Ibus是输入法框架。 <br /> +在Ubuntu的中文系统中自带了中文输入法,通过Ctrl+Space可切换中英文输入法。 <br /> +假设我们装了Ubuntu英文系统,或系统自带输入法损坏,,,,,,, </p> +<hr /> +<h4 id="1">1.安装语言包<a class="headerlink" href="#1" title="Permanent link">&para;</a></h4> +<p>System Settings--&gt;Language Support--&gt;Install/Remove Languages<br /> +<img alt="Install /Remove Languages" src="http://tulparblog.qiniudn.com/ubuntu20120728104525690.png" /></p> +<h4 id="2ibus">2.安装并启动IBus框架<a class="headerlink" href="#2ibus" title="Permanent link">&para;</a></h4> +<p>安装Ibus框架:</p> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">ibus</span> <span class="n">ibus</span><span class="o">-</span><span class="n">clutter</span> <span class="n">ibus</span><span class="o">-</span><span class="n">gtk</span> <span class="n">ibus</span><span class="o">-</span><span class="n">gtk3</span> <span class="n">ibus</span><span class="o">-</span><span class="n">qt4</span> +</pre></div> + + +<p>启动IBus框架: +<code>im-switch -s ibus</code> <br /> +注销系统,保证更改立即生效。 </p> +<h4 id="3">3.安装拼音引擎<a class="headerlink" href="#3" title="Permanent link">&para;</a></h4> +<p>有下面几种常用选择: <br /> +IBus拼音:<code>sudo apt-get install ibus-pinyin</code> <br /> +IBUS五笔:<code>sudo apt-get install ibus-table-wubi</code> <br /> +谷歌拼音输入法:<code>sudo apt-get install ibus-googlepinyin</code> <br /> +Sun拼音输入法:<code>sudo apt-get install ibus-sunpinyin</code> </p> +<h4 id="4ibus">4.设置IBus框架<a class="headerlink" href="#4ibus" title="Permanent link">&para;</a></h4> +<p><code>ibus-setup</code> <br /> +此时,IBus Preference设置被打开。我们在Input Method选项卡中,选择自己喜欢的输入方式,并配置自己喜欢的快捷键即可。如下图所示:<img alt="Input" src="http://tulparblog.qiniudn.com/ubuntu20120728104528231.png" /></p> +<h4 id="5ibus">5.如果Ibus的图标不在右上角显示,可以使用如下命令找回<a class="headerlink" href="#5ibus" title="Permanent link">&para;</a></h4> +<p><code>ibus-daemon -drx</code></p> +<hr /> +<p>Thats all</p>回家路2014-07-16T00:00:00+08:00Wontag:wbowam.github.io,2014-07-16:hui-jia-lu.html<h3 id="_1">就这么又一次开始了回家的旅途<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p><img alt="就这样开始" src="http://tulparblog.qiniudn.com/lifeIMG_20140711_110306.jpg" /></p> +<h3 id="3">在北京转车,得等3个小时,吃了吨开心午餐<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3> +<p><img alt="开心午餐,磨的是时间" src="http://tulparblog.qiniudn.com/lifeIMG_20140711_130640.jpg" /></p> +<h3 id="_2">两天后的驴友,醒醒吧,还有两天<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p><img alt="是的,的确很累!!!" src="http://tulparblog.qiniudn.com/lifeIMG_20140713_095127.jpg" /></p> +<h3 id="_3">吐鲁番,转车,很累,吃到家乡的拉面,很开心<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<p><img alt="虽然,做的不怎么好吃" src="http://tulparblog.qiniudn.com/lifeIMG_20140713_073856.jpg" /></p> +<h3 id="_4">终于,到家了<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<p><img alt="我家后面" src="http://tulparblog.qiniudn.com/lifeIMG_20140717_135705.jpg" /> +<img alt="嗯,就是的" src="http://tulparblog.qiniudn.com/lifeIMG_20140717_135934.jpg" /></p>格式化字符串——时间2014-07-08T00:00:00+08:00Wontag:wbowam.github.io,2014-07-08:ge-shi-hua-zi-fu-chuan-shi-jian.html<p>之前介绍过<a href="http://tulpar008.github.io/ben-ban-fa-xue-python.html">格式化字符串</a> <br /> +本篇专门介绍格式化字符串——时间 </p> +<hr /> +<p>所有日期、时间的api都在datetime模块内。</p> +<h5 id="1-datetime-string">1. datetime =&gt; string<a class="headerlink" href="#1-datetime-string" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">()</span> +<span class="n">now</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +<span class="err">输出</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">05</span> <span class="mi">16</span><span class="o">:</span><span class="mi">26</span><span class="o">:</span><span class="mf">23.870105</span> +</pre></div> + + +<p>strftime是datetime类的实例方法。</p> +<h5 id="2-string-datetime">2. string =&gt; datetime<a class="headerlink" href="#2-string-datetime" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">t_str</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">05</span> <span class="mi">16</span><span class="o">:</span><span class="mi">26</span><span class="o">:</span><span class="mi">23</span><span class="err">&#39;</span> +<span class="n">d</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">t_str</span><span class="p">,</span> <span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>strptime是datetime类的静态方法。</p> +<h5 id="_1">有关时间的更多格式化字符串:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="c">%a Abbreviated weekday name</span> +<span class="c">%A Full weekday name</span> +<span class="c">%b Abbreviated month name</span> +<span class="c">%B Full month name</span> +<span class="c">%c Date and time representation appropriate for locale</span> +<span class="c">%d Day of month as decimal number (01 - 31)</span> +<span class="c">%H Hour in 24-hour format (00 - 23)</span> +<span class="c">%I Hour in 12-hour format (01 - 12)</span> +<span class="c">%j Day of year as decimal number (001 - 366)</span> +<span class="c">%m Month as decimal number (01 - 12)</span> +<span class="c">%M Minute as decimal number (00 - 59)</span> +<span class="c">%p Current locale&#39;s A.M./P.M. indicator for 12-hour clock</span> +<span class="c">%S Second as decimal number (00 - 59)</span> +<span class="c">%U Week of year as decimal number, with Sunday as first day of week (00 - 51)</span> +<span class="c">%w Weekday as decimal number (0 - 6; Sunday is 0)</span> +<span class="c">%W Week of year as decimal number, with Monday as first day of week (00 - 51)</span> +<span class="c">%x Date representation for current locale</span> +<span class="c">%X Time representation for current locale</span> +<span class="c">%y Year without century, as decimal number (00 - 99)</span> +<span class="c">%Y Year with century, as decimal number</span> +<span class="c">%z, %Z Time-zone name or abbreviation; no characters if time zone is unknown</span> +<span class="c">%% Percent sign</span> +</pre></div>Python时间操作2014-07-08T00:00:00+08:00Wontag:wbowam.github.io,2014-07-08:pythonshi-jian-cao-zuo.html<p>所有日期、时间的api都在datetime模块内。 <br /> +参考<a href="http://tulpar008.github.io/ge-shi-hua-zi-fu-chuan-shi-jian.html">时间格式化字符串</a></p> +<h3 id="1-datetime-string">1. datetime =&gt; string<a class="headerlink" href="#1-datetime-string" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">()</span> +<span class="n">now</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +<span class="err">输出</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">05</span> <span class="mi">16</span><span class="o">:</span><span class="mi">26</span><span class="o">:</span><span class="mf">23.870105</span> +</pre></div> + + +<p>strftime是datetime类的实例方法。</p> +<h3 id="2-string-datetime">2. string =&gt; datetime<a class="headerlink" href="#2-string-datetime" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">t_str</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">05</span> <span class="mi">16</span><span class="o">:</span><span class="mi">26</span><span class="o">:</span><span class="mi">23</span><span class="err">&#39;</span> +<span class="n">d</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">t_str</span><span class="p">,</span> <span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>strptime是datetime类的静态方法。</p> +<h3 id="3">3.时间的比较<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3> +<h5 id="datetimetimedelta">在datetime模块中有timedelta类,这个类的对象用于表示一个时间间隔,比如两个日期或者时间的差别。<a class="headerlink" href="#datetimetimedelta" title="Permanent link">&para;</a></h5> +<p>构造方法: </p> +<div class="highlight"><pre><span class="n">datetime</span><span class="p">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">seconds</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">microseconds</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">milliseconds</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">minutes</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">hours</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">weeks</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> +</pre></div> + + +<p>所有的参数都有默认值0,这些参数可以是int或float,正的或负的。 </p> +<p>可以通过timedelta.days、tiemdelta.seconds等获取相应的时间值。</p> +<h5 id="_1">通过这个类可以很方便的实现一些功能,如<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<ol> +<li>两个日期相差多少。</li> +</ol> +<div class="highlight"><pre><span class="n">d1</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">strptime</span><span class="p">(</span><span class="err">&#39;</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">05</span> <span class="mi">17</span><span class="o">:</span><span class="mi">41</span><span class="o">:</span><span class="mi">20</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">d2</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">strptime</span><span class="p">(</span><span class="err">&#39;</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">02</span> <span class="mi">17</span><span class="o">:</span><span class="mi">41</span><span class="o">:</span><span class="mi">20</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">delta</span> <span class="o">=</span> <span class="n">d1</span> <span class="o">-</span> <span class="n">d2</span> +<span class="n">print</span> <span class="n">delta</span><span class="p">.</span><span class="n">days</span> +<span class="n">print</span> <span class="n">delta</span><span class="p">.</span><span class="n">hours</span> +</pre></div> + + +<p>输出:<code>3 72</code></p> +<ol> +<li>今天的n天后的日期。</li> +</ol> +<div class="highlight"><pre><span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">()</span> +<span class="n">delta</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">n_days</span> <span class="o">=</span> <span class="n">now</span> <span class="o">+</span> <span class="n">delta</span> +<span class="n">print</span> <span class="n">n_days</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>输出:<code>2012-03-08 17:44:50</code></p>Python中raw_input和input的异同点2014-07-08T00:00:00+08:00Wontag:wbowam.github.io,2014-07-08:pythonzhong-raw_inputhe-inputde-yi-tong-dian.html<p>一般软件做的事情主要就是下面几条:<br /> +· 接受人的输入。 <br /> +· 改变输入。 <br /> +· 打印出改变了的输入 <br /> + ———来自&lt;<a href="http://tulpar008.github.io/ben-ban-fa-xue-python.html">笨办法学Python</a>&gt;</p> +<hr /> +<h3 id="_1">相同点<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>这两个函数均用来接收输入,上述真理已足以说明它们的重要性,我不赘述了。</p> +<h3 id="_2">不同点<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p><strong>1. raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收)。而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它会引发一个 SyntaxError 。</strong></p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span><span class="n">a</span><span class="o">=</span><span class="nx">raw_input</span><span class="p">(</span><span class="s2">&quot;请输入字符串,不用写引号:&quot;</span><span class="p">)</span> +<span class="err">请输入字符串,不用写引号:</span><span class="nx">guoshu</span> + +<span class="o">&gt;&gt;&gt;</span><span class="n">b</span><span class="o">=</span><span class="nb">input</span><span class="p">(</span><span class="s2">&quot;请输入字符串,不写引号试试:&quot;</span><span class="p">)</span> +<span class="err">请输入字符串,不写引号试试:</span><span class="nx">guoshu</span> + +<span class="nx">Traceback</span> <span class="p">(</span><span class="nx">most</span> <span class="nx">recent</span> <span class="nb">call</span> <span class="nb">last</span><span class="p">):</span> + <span class="nb">File</span> <span class="s2">&quot;&lt;pyshell#1&gt;&quot;</span><span class="p">,</span> <span class="nb">line</span> <span class="mi">1</span><span class="p">,</span> <span class="k">in</span> <span class="o">&lt;</span><span class="nx">module</span><span class="o">&gt;</span> + <span class="n">input_A</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&quot;Input: &quot;</span><span class="p">)</span> + <span class="nb">File</span> <span class="s2">&quot;&lt;string&gt;&quot;</span><span class="p">,</span> <span class="nb">line</span> <span class="mi">1</span><span class="p">,</span> <span class="k">in</span> <span class="o">&lt;</span><span class="nx">module</span><span class="o">&gt;</span> +<span class="nx">NameError</span><span class="p">:</span> <span class="nb">name</span> <span class="s1">&#39;guoshu&#39;</span> <span class="nx">is</span> <span class="ow">not</span> <span class="nx">defined</span> + +<span class="o">&gt;&gt;&gt;</span><span class="n">c</span><span class="o">=</span><span class="nb">input</span><span class="p">(</span><span class="s2">&quot;请输入字符串,必须写引号:&quot;</span><span class="p">)</span> +<span class="err">请输入字符串,必须写引号:</span><span class="nx">guoshu</span> +</pre></div> + + +<p><strong>2. raw_input() 将所有输入作为字符串看待,返回字符串类型。而input() 可接受合法的 python 表达式,包括数字,字符串(有引号才算合法的字符串表达式),其他(如1+2)。</strong></p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span><span class="n">d1</span><span class="o">=</span><span class="n">raw_input</span><span class="p">(</span><span class="s">&quot;raw_input输入数字时:&quot;</span> +<span class="n">raw_input</span><span class="err">输入数字时:</span><span class="mi">123</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">type</span><span class="p">(</span><span class="n">d1</span><span class="p">)</span> +<span class="o">&lt;</span><span class="n">type</span> <span class="err">&#39;</span><span class="n">str</span><span class="err">&#39;</span><span class="o">&gt;</span> + +<span class="o">&gt;&gt;&gt;</span><span class="n">d2</span><span class="o">=</span><span class="n">input</span><span class="p">(</span><span class="s">&quot;input输入数字时:&quot;</span><span class="p">)</span> +<span class="n">input</span><span class="err">输入数字时:</span><span class="mi">123</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">type</span><span class="p">(</span><span class="n">d2</span><span class="p">)</span> +<span class="o">&lt;</span><span class="n">type</span> <span class="err">&#39;</span><span class="kt">int</span><span class="err">&#39;</span><span class="o">&gt;</span> + +<span class="o">&gt;&gt;&gt;</span><span class="n">e1</span><span class="o">=</span><span class="n">raw_input</span><span class="p">(</span><span class="s">&quot;raw_input输入表达式时:&quot;</span> +<span class="n">raw_input</span><span class="err">输入表达式时:</span><span class="mi">3</span><span class="o">+</span><span class="mi">2</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">type</span><span class="p">(</span><span class="n">e1</span><span class="p">)</span> +<span class="o">&lt;</span><span class="n">type</span> <span class="err">&#39;</span><span class="n">str</span><span class="err">&#39;</span><span class="o">&gt;</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">e1</span> +<span class="err">&#39;</span><span class="mi">3</span><span class="o">+</span><span class="mi">2</span><span class="err">&#39;</span> + +<span class="o">&gt;&gt;&gt;</span><span class="n">e2</span><span class="o">=</span><span class="n">input</span><span class="p">(</span><span class="s">&quot;input输入表达式时:&quot;</span> +<span class="n">input</span><span class="err">输入表达式时:</span><span class="mi">3</span><span class="o">+</span><span class="mi">2</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">type</span><span class="p">(</span><span class="n">e2</span><span class="p">)</span> +<span class="o">&lt;</span><span class="n">type</span> <span class="err">&#39;</span><span class="kt">int</span><span class="err">&#39;</span><span class="o">&gt;</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">e2</span> +<span class="mi">5</span> +</pre></div> + + +<h3 id="_3">看看文档时怎么说滴:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="nx">input</span><span class="p">(</span><span class="cp">[</span><span class="nx">prompt</span><span class="cp">]</span><span class="p">)</span> +<span class="o">*</span> <span class="nx">Equivalent</span> <span class="nx">to</span> <span class="nb">eval</span><span class="p">(</span><span class="nx">raw_input</span><span class="p">(</span><span class="nx">prompt</span><span class="p">)).</span> + +<span class="o">*</span> <span class="nx">This</span> <span class="kd">function</span> <span class="nx">does</span> <span class="nx">not</span> <span class="k">catch</span> <span class="nx">user</span> <span class="nx">errors</span><span class="p">.</span> <span class="nx">If</span> <span class="nx">the</span> <span class="nx">input</span> <span class="nx">is</span> <span class="nx">not</span> <span class="nx">syntactically</span> <span class="nx">valid</span><span class="p">,</span> <span class="nx">a</span> <span class="nx">SyntaxError</span> <span class="nx">will</span> <span class="nx">be</span> <span class="nx">raised</span><span class="p">.</span> <span class="nx">Other</span> <span class="nx">exceptions</span> <span class="nx">may</span> <span class="nx">be</span> <span class="nx">raised</span> <span class="k">if</span> <span class="nx">there</span> <span class="nx">is</span> <span class="nx">an</span> <span class="nx">error</span> <span class="nx">during</span> <span class="nx">evaluation</span><span class="p">.</span> + +<span class="o">*</span> <span class="nx">If</span> <span class="nx">the</span> <span class="nx">readline</span> <span class="nx">module</span> <span class="nx">was</span> <span class="nx">loaded</span><span class="p">,</span> <span class="nx">then</span> <span class="nx">input</span><span class="p">()</span> <span class="nx">will</span> <span class="nx">use</span> <span class="nx">it</span> <span class="nx">to</span> <span class="nx">provide</span> <span class="nx">elaborate</span> <span class="nx">line</span> <span class="nx">editing</span> <span class="nx">and</span> <span class="nx">history</span> <span class="nx">features</span><span class="p">.</span> + +<span class="o">*</span> <span class="nx">Consider</span> <span class="nx">using</span> <span class="nx">the</span> <span class="nx">raw_input</span><span class="p">()</span> <span class="kd">function</span> <span class="k">for</span> <span class="nx">general</span> <span class="nx">input</span> <span class="nx">from</span> <span class="nx">users</span><span class="p">.</span> +</pre></div> + + +<h5 id="_4">第一点<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h5> +<p>input() 本质上还是使用 raw_input() 来实现的,只是调用完 raw_input() 之后再调用 <a href="http://tulpar008.github.io/python-exeche-evalyu-ju.html">eval() 函数</a>。</p> +<h5 id="_5">第四点<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h5> +<p>除非对 input() 有特别需要,否则一般情况下我们都是推荐使用 raw_input() 来与用户交互。</p>__init__()方法2014-07-07T00:00:00+08:00Wontag:wbowam.github.io,2014-07-07:__init__fang-fa.html<h3 id="__">首先复习一下,<a href="http://tulpar008.github.io/pythonzhong-__shuang-xia-hua-xian-de-zuo-yong.html">__(双下划线)的作用</a><a class="headerlink" href="#__" title="Permanent link">&para;</a></h3> +<ul> +<li> +<p>Python中默认的成员函数,成员变量都是公开的(public),而且python中没有类似public,private等关键词来修饰成员函数,成员变量。 </p> +</li> +<li> +<p>可有时候需要用到私有变量,因此诞生了__。 </p> +</li> +<li> +<p>变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就会为私有的了。</p> +</li> +<li> +<p>私有意味着只有内部能使用,对外部隐藏。 </p> +</li> +<li> +<p>在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername来使用。 <br /> +在外部,使用原来的私有成员的名字时,会提示找不到。(达到了隐藏的效果) </p> +</li> +</ul> +<hr /> +<p>很显然,__init__是个私有函数</p> +<h5 id="__init__">__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。<a class="headerlink" href="#__init__" title="Permanent link">&para;</a></h5> +<h6 id="_1">注意,这个名称的开始和结尾都是双下划线。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h6>django 分页2014-07-07T00:00:00+08:00Wontag:wbowam.github.io,2014-07-07:django-fen-ye.html<p>我个人使用gmail的邮件服务器,不过经常会被墙,因此下面讲解使用qq邮箱服务器。</p> +<ol> +<li>首先看看django-pagination</li> +</ol> +<hr /> +<h4 id="settingspy">settings.py<a class="headerlink" href="#settingspy" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">TEMPLATE_CONTEXT_PROCESSORS</span> <span class="o">=</span> <span class="p">(</span> +<span class="s">&quot;django.contrib.auth.context_processors.auth&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.debug&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.i18n&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.media&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.static&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.tz&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.request&quot;</span><span class="p">,)</span> + +<span class="n">MIDDLEWARE_CLASSES</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">common</span><span class="p">.</span><span class="n">CommonMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sessions</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">SessionMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">csrf</span><span class="p">.</span><span class="n">CsrfViewMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">AuthenticationMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">messages</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">MessageMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">pagination</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">PaginationMiddleware</span><span class="err">&#39;</span><span class="p">,</span> +<span class="p">)</span> +<span class="n">INSTALLED_APPS</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">contenttypes</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sessions</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sites</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">messages</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">staticfiles</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">admin</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">admindocs</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">photologue</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">pagination</span><span class="err">&#39;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<h4 id="template">template<a class="headerlink" href="#template" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="p">{</span><span class="o">%</span> <span class="nx">load</span> <span class="nx">pagination_tags</span> <span class="o">%</span><span class="p">}</span> +<span class="p">{</span><span class="o">%</span> <span class="nx">autopaginate</span> <span class="nx">articles_list</span> <span class="mi">9</span> <span class="o">%</span><span class="p">}</span> +<span class="o">&lt;</span><span class="nx">ul</span><span class="o">&gt;</span> + <span class="p">{</span><span class="o">%</span> <span class="nb">for</span> <span class="n">item</span> <span class="k">in</span> <span class="nx">articles_list</span> <span class="o">%</span><span class="p">}</span> + <span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;</span> + <span class="o">&lt;</span><span class="nx">span</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="n">href</span><span class="o">=</span><span class="s2">&quot;#&quot;</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot;icon-thumbs-up&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">a</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="n">href</span><span class="o">=</span><span class="s2">&quot;#&quot;</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot; icon-thumbs-down&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">a</span><span class="o">&gt;&lt;/</span><span class="nx">span</span><span class="o">&gt;</span> + <span class="o">&lt;</span><span class="nb">div</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot;list-title&quot;</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="n">href</span><span class="o">=</span><span class="s2">&quot;#&quot;</span><span class="o">&gt;</span><span class="p">{{</span> <span class="nx">item.title</span> <span class="o">|</span> <span class="nx">slice</span><span class="p">:</span><span class="s2">&quot;15&quot;</span> <span class="p">}}</span><span class="o">&lt;/</span><span class="nx">a</span><span class="o">&gt;&lt;/</span><span class="nb">div</span><span class="o">&gt;</span> + + <span class="o">&lt;</span><span class="nb">img</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot;thumbnail&quot;</span> <span class="n">src</span><span class="o">=</span><span class="s2">&quot;/media/{{ item.title_image }}&quot;</span><span class="o">&gt;&lt;</span><span class="nx">p</span><span class="o">&gt;</span><span class="p">{{</span> <span class="nx">item.title_image</span> <span class="p">}}</span> + <span class="p">{{</span> <span class="nx">item.summary</span> <span class="o">|</span> <span class="nx">slice</span><span class="p">:</span><span class="s2">&quot;150&quot;</span><span class="p">}}</span><span class="o">&lt;/</span><span class="nx">p</span><span class="o">&gt;</span> + <span class="o">&lt;</span><span class="nb">div</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot;circle&quot;</span><span class="o">&gt;&lt;</span><span class="nb">div</span><span class="o">&gt;&lt;/</span><span class="nb">div</span><span class="o">&gt;&lt;</span><span class="nb">div</span><span class="o">&gt;&lt;/</span><span class="nb">div</span><span class="o">&gt;&lt;</span><span class="nb">div</span><span class="o">&gt;&lt;/</span><span class="nb">div</span><span class="o">&gt;&lt;/</span><span class="nb">div</span><span class="o">&gt;</span> + <span class="o">&lt;/</span><span class="nx">li</span><span class="o">&gt;</span> + <span class="p">{</span><span class="o">%</span> <span class="nx">endfor</span> <span class="o">%</span><span class="p">}</span> + <span class="p">{</span><span class="o">%</span> <span class="nx">paginate</span> <span class="o">%</span><span class="p">}</span> + <span class="o">&lt;/</span><span class="nx">ul</span><span class="o">&gt;</span> +</pre></div> + + +<h4 id="_1">定制<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<h5 id="_2">美化什么的好弄<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h5> +<h5 id="_3">翻译<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h5> +<ol> +<li>直接入侵式修改(强烈不推荐)</li> +<li>把pagination.html复制到本地template目录,然后再<a href="http://tulpar008.github.io/django-guo-ji-hua.html">翻译</a> <br /> + pagination.html在<code>(环境目录)/lib/sitepackages/pagination/templates/paginaion.html</code></li> +</ol>Django 使用邮件服务2014-07-07T00:00:00+08:00Wontag:wbowam.github.io,2014-07-07:django-shi-yong-you-jian-fu-wu.html<p>我个人使用gmail的邮件服务器,不过经常会被墙,因此下面讲解使用qq邮箱服务器。</p> +<hr /> +<h3 id="django-settingspy">django settings.py<a class="headerlink" href="#django-settingspy" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">DEFAULT_FROM_EMAIL</span><span class="o">=</span><span class="err">&#39;</span><span class="mi">49244564</span><span class="err">@</span><span class="n">qq</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="cp">#django 要求这里的“发送者”邮箱必须和超级管理员的邮箱一致,而且不能为空</span> +<span class="n">EMAIL_USE_TLS</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">EMAIL_HOST</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">smtp</span><span class="p">.</span><span class="n">qq</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">EMAIL_PORT</span> <span class="o">=</span> <span class="mi">587</span> +<span class="cp">##此处用的是SMTP的SSL加密方式,所以使用587或465端口号,不然可以用25端口。</span> +<span class="n">EMAIL_HOST_USER</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">49244564</span><span class="err">@</span><span class="n">qq</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">EMAIL_HOST_PASSWORD</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">wodeqqyouxiangmima</span><span class="err">&#39;</span> +</pre></div> + + +<h3 id="qqsmtp">开启qq邮箱SMTP服务<a class="headerlink" href="#qqsmtp" title="Permanent link">&para;</a></h3> +<p>设置——账户——开启服务————打勾“POP3/SMTP服务和IMAP/SMTP服务“ </p>init__()方法2014-07-07T00:00:00+08:00Wontag:wbowam.github.io,2014-07-07:init__fang-fa.html<h3 id="__">首先复习一下,<a href="http://tulpar008.github.io/pythonzhong-__shuang-xia-hua-xian-de-zuo-yong.html">__(双下划线)的作用</a><a class="headerlink" href="#__" title="Permanent link">&para;</a></h3> +<ul> +<li> +<p>Python中默认的成员函数,成员变量都是公开的(public),而且python中没有类似public,private等关键词来修饰成员函数,成员变量。 </p> +</li> +<li> +<p>可有时候需要用到私有变量,因此诞生了__。 </p> +</li> +<li> +<p>变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就会为私有的了。</p> +</li> +<li> +<p>私有意味着只有内部能使用,对外部隐藏。 </p> +</li> +<li> +<p>在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername来使用。 <br /> +在外部,使用原来的私有成员的名字时,会提示找不到。(达到了隐藏的效果) </p> +</li> +</ul> +<hr /> +<p>很显然,__init__是个私有函数</p> +<h5 id="__init__">__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。<a class="headerlink" href="#__init__" title="Permanent link">&para;</a></h5> +<h6 id="_1">注意,这个名称的开始和结尾都是双下划线。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h6>python 实例方法,静态方法,类方法2014-07-07T00:00:00+08:00Wontag:wbowam.github.io,2014-07-07:python-shi-li-fang-fa-jing-tai-fang-fa-lei-fang-fa.html<h3 id="_1">实例方法(@郭叔)<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>字面意思:实例的方法,即只有实例能使用的方法,相对于类方法和静态方法。</p> +<h5 id="self">实例方法的第一个参数默认为self,代指实例。<a class="headerlink" href="#self" title="Permanent link">&para;</a></h5> +<p>如:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Foo</span><span class="o">:</span> + <span class="err">##</span><span class="n">init</span><span class="p">()</span><span class="err">是生成实例时默认调用的实例方法</span><span class="p">,</span><span class="err">用于初始化详细见</span><span class="p">[</span><span class="n">__init__</span><span class="err">方法</span><span class="p">](</span><span class="err">#</span><span class="p">)</span> + <span class="err">###第一个参数默认为</span><span class="n">self</span> + <span class="n">def</span> <span class="n">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span><span class="o">:</span> + <span class="n">self</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> + <span class="n">self</span><span class="p">.</span><span class="n">author</span><span class="o">=</span><span class="s">&quot;Tulpar&quot;</span> + <span class="err">##又一个实例方法</span> + <span class="n">def</span> <span class="n">hi</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="n">print</span> <span class="n">self</span><span class="p">.</span><span class="n">name</span> + <span class="n">print</span> <span class="s">&quot;Created by %s&quot;</span><span class="o">%</span><span class="n">self</span><span class="p">.</span><span class="n">author</span> +</pre></div> + + +<h5 id="selfguoshu">self不是一个关键字,而是约定的写法。也可以换成任意字符串,如'guoshu'<a class="headerlink" href="#selfguoshu" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre> <span class="err">###第一个参数默认为</span><span class="n">guoshu</span><span class="p">,</span><span class="err">作用和</span><span class="n">self</span><span class="err">一样</span> + <span class="n">def</span> <span class="n">__init__</span><span class="p">(</span><span class="n">guoshu</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span><span class="o">:</span> + <span class="n">guoshu</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> + <span class="n">guoshu</span><span class="p">.</span><span class="n">author</span><span class="o">=</span><span class="s">&quot;Tulpar&quot;</span> + <span class="err">##又一个实例方法</span> + <span class="n">def</span> <span class="n">hi</span><span class="p">(</span><span class="n">guoshu</span><span class="p">)</span><span class="o">:</span> + <span class="n">print</span> <span class="n">guoshu</span><span class="p">.</span><span class="n">name</span> + <span class="n">print</span> <span class="s">&quot;Created by %s&quot;</span><span class="o">%</span><span class="n">guoshu</span><span class="p">.</span><span class="n">author</span> +</pre></div> + + +<h3 id="_2">静态方法<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p>静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Foo</span><span class="o">:</span> + <span class="err">##静态方法走起</span> + <span class="err">@</span><span class="n">staticmethod</span> + <span class="n">def</span> <span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span><span class="o">:</span> + <span class="n">print</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> +</pre></div> + + +<p>运行结果</p> +<div class="highlight"><pre><span class="cp">###生成实例f1</span> +<span class="o">&gt;</span><span class="n">f1</span><span class="o">=</span><span class="n">Foo</span><span class="p">(</span><span class="n">u</span><span class="err">&#39;果树&#39;</span><span class="p">)</span> +<span class="cp">###实例能用静态方法</span> +<span class="o">&gt;</span><span class="n">f1</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span> +<span class="cp">###类对象也能使用静态方法</span> +<span class="o">&gt;</span><span class="n">Foo</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span> +<span class="cp">###输出结果</span> +<span class="mi">8</span> +<span class="mi">8</span> +</pre></div> + + +<h3 id="_3">类方法<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<p>正在更新!!</p>python中 __(双下划线)的作用2014-07-07T00:00:00+08:00Wontag:wbowam.github.io,2014-07-07:pythonzhong-__shuang-xia-hua-xian-de-zuo-yong.html<ul> +<li> +<p>Python中默认的成员函数,成员变量都是公开的(public),而且python中没有类似public,private等关键词来修饰成员函数,成员变量。 </p> +</li> +<li> +<p>可有时候需要用到私有变量,因此诞生了__。 </p> +</li> +<li> +<p>变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就会为私有的了。</p> +</li> +<li> +<p>私有意味着只有内部能使用,对外部隐藏。 </p> +</li> +<li> +<p>在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername来使用。 <br /> +在外部,使用原来的私有成员的名字时,会提示找不到。(达到了隐藏的效果) </p> +</li> +</ul> +<hr /> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Tester</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">__foo</span> <span class="o">=</span> <span class="s">&quot;hi&quot;</span> + +<span class="o">&gt;&gt;&gt;</span> <span class="n">t</span> <span class="o">=</span> <span class="n">Tester</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">t</span><span class="p">.</span><span class="n">_Tester__foo</span> +<span class="err">&#39;</span><span class="n">hi</span><span class="err">&#39;</span> +</pre></div> + + +<div class="highlight"><pre><span class="n">class</span> <span class="n">Tester</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> +<span class="p">...</span> <span class="n">def</span> <span class="n">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> +<span class="p">...</span> <span class="n">self</span><span class="p">.</span><span class="n">__foo</span> <span class="o">=</span> <span class="s">&quot;hi&quot;</span> +<span class="p">...</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">t</span><span class="o">=</span><span class="n">Tester</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">t</span><span class="p">.</span><span class="n">_Tester__foo</span> +<span class="err">&#39;</span><span class="n">hi</span><span class="err">&#39;</span> +</pre></div>Python with语句2014-07-03T00:00:00+08:00Wontag:wbowam.github.io,2014-07-03:python-withyu-ju.html<p>感谢<a href="http://sdqali.in/blog/2012/07/09/understanding-pythons-with/">Sadique Ali</a>的总结分享</p> +<h3 id="with">With语句是什么?<a class="headerlink" href="#with" title="Permanent link">&para;</a></h3> +<p>有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。 <br /> +一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。</p> +<p>如果不用with语句,代码如下:</p> +<div class="highlight"><pre><span class="n">file</span> <span class="o">=</span> <span class="n">open</span><span class="p">(</span><span class="s">&quot;/tmp/foo.txt&quot;</span><span class="p">)</span> +<span class="n">data</span> <span class="o">=</span> <span class="n">file</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> +<span class="n">file</span><span class="p">.</span><span class="n">close</span><span class="p">()</span> +</pre></div> + + +<p>这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是处理异常的加强版本:</p> +<div class="highlight"><pre><span class="n">file</span> <span class="o">=</span> <span class="n">open</span><span class="p">(</span><span class="s">&quot;/tmp/foo.txt&quot;</span><span class="p">)</span> +<span class="nl">try:</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">file</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> +<span class="nl">finally:</span> + <span class="n">file</span><span class="p">.</span><span class="n">close</span><span class="p">()</span> +</pre></div> + + +<p>虽然这段代码运行良好,但是太冗长了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:</p> +<div class="highlight"><pre><span class="n">with</span> <span class="n">open</span><span class="p">(</span><span class="s">&quot;/tmp/foo.txt&quot;</span><span class="p">)</span> <span class="n">as</span> <span class="n">file</span><span class="o">:</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">file</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> +</pre></div> + + +<h3 id="with_1">with如何工作?<a class="headerlink" href="#with_1" title="Permanent link">&para;</a></h3> +<p>这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。 </p> +<p>紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。</p> +<p>下面例子可以具体说明with如何工作:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span> +<span class="c"># with_example01.py</span> + + +<span class="k">class</span> <span class="nc">Sample</span><span class="p">:</span> + <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="k">print</span> <span class="s">&quot;In __enter__()&quot;</span> + <span class="k">return</span> <span class="s">&quot;Foo&quot;</span> + + <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">trace</span><span class="p">):</span> + <span class="k">print</span> <span class="s">&quot;In __exit__()&quot;</span> + + +<span class="k">def</span> <span class="nf">get_sample</span><span class="p">():</span> + <span class="k">return</span> <span class="n">Sample</span><span class="p">()</span> + + +<span class="k">with</span> <span class="n">get_sample</span><span class="p">()</span> <span class="k">as</span> <span class="n">sample</span><span class="p">:</span> + <span class="k">print</span> <span class="s">&quot;sample:&quot;</span><span class="p">,</span> <span class="n">sample</span> +</pre></div> +</td></tr></table> + +<p>运行代码,输出如下</p> +<div class="highlight"><pre><span class="n">bash</span><span class="o">-</span><span class="mf">3.2</span><span class="err">$</span> <span class="p">.</span><span class="o">/</span><span class="n">with_example01</span><span class="p">.</span><span class="n">py</span> +<span class="n">In</span> <span class="n">__enter__</span><span class="p">()</span> +<span class="nl">sample:</span> <span class="n">Foo</span> +<span class="n">In</span> <span class="n">__exit__</span><span class="p">()</span> +</pre></div> + + +<p>正如你看到的, </p> +<div class="highlight"><pre><span class="mf">1.</span> <span class="n">__enter__</span><span class="p">()</span><span class="err">方法被执行</span> +<span class="mf">2.</span> <span class="n">__enter__</span><span class="p">()</span><span class="err">方法返回的值</span> <span class="o">-</span> <span class="err">这个例子中是</span><span class="s">&quot;Foo&quot;</span><span class="err">,赋值给变量&#39;</span><span class="n">sample</span><span class="err">&#39;</span> +<span class="mf">3.</span> <span class="err">执行代码块,打印变量</span><span class="s">&quot;sample&quot;</span><span class="err">的值为</span> <span class="s">&quot;Foo&quot;</span> +<span class="mf">4.</span> <span class="n">__exit__</span><span class="p">()</span><span class="err">方法被调用</span> +</pre></div> + + +<p>with真正强大之处是它可以处理异常。可能你已经注意到Sample类的__exit__方法有三个参数- val, type 和 trace。 这些参数在异常处理中相当有用。我们来改一下代码,看看具体如何工作的。</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span> +<span class="c"># with_example02.py</span> + + +<span class="k">class</span> <span class="nc">Sample</span><span class="p">:</span> + <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="k">return</span> <span class="bp">self</span> + + <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">trace</span><span class="p">):</span> + <span class="k">print</span> <span class="s">&quot;type:&quot;</span><span class="p">,</span> <span class="nb">type</span> + <span class="k">print</span> <span class="s">&quot;value:&quot;</span><span class="p">,</span> <span class="n">value</span> + <span class="k">print</span> <span class="s">&quot;trace:&quot;</span><span class="p">,</span> <span class="n">trace</span> + + <span class="k">def</span> <span class="nf">do_something</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="n">bar</span> <span class="o">=</span> <span class="mi">1</span><span class="o">/</span><span class="mi">0</span> + <span class="k">return</span> <span class="n">bar</span> <span class="o">+</span> <span class="mi">10</span> + +<span class="k">with</span> <span class="n">Sample</span><span class="p">()</span> <span class="k">as</span> <span class="n">sample</span><span class="p">:</span> + <span class="n">sample</span><span class="o">.</span><span class="n">do_something</span><span class="p">()</span> +</pre></div> +</td></tr></table> + +<p>这个例子中,with后面的get_sample()变成了Sample()。这没有任何关系,只要紧跟with后面的语句所返回的对象有__enter__()和__exit__()方法即可。此例中,Sample()的__enter__()方法返回新创建的Sample对象,并赋值给变量sample。 </p> +<p>代码执行后:</p> +<div class="highlight"><pre><span class="nx">bash</span><span class="o">-</span><span class="mf">3.2</span><span class="err">$</span> <span class="nx">.</span><span class="p">/</span><span class="nx">with_example02.py</span> +<span class="k">type</span><span class="p">:</span> <span class="o">&lt;</span><span class="k">type</span> <span class="s1">&#39;exceptions.ZeroDivisionError&#39;</span><span class="o">&gt;</span> +<span class="nb">value</span><span class="p">:</span> <span class="kt">integer</span> <span class="nx">division</span> <span class="ow">or</span> <span class="nx">modulo</span> <span class="k">by</span> <span class="nx">zero</span> +<span class="nb">trace</span><span class="p">:</span> <span class="o">&lt;</span><span class="nx">traceback</span> <span class="nb">object</span> <span class="nx">at</span> <span class="mh">0x1004a8128</span><span class="o">&gt;</span> +<span class="nx">Traceback</span> <span class="p">(</span><span class="nx">most</span> <span class="nx">recent</span> <span class="nb">call</span> <span class="nb">last</span><span class="p">):</span> + <span class="nb">File</span> <span class="s2">&quot;./with_example02.py&quot;</span><span class="p">,</span> <span class="nb">line</span> <span class="mi">19</span><span class="p">,</span> <span class="k">in</span> <span class="o">&lt;</span><span class="nx">module</span><span class="o">&gt;</span> + <span class="nx">sample.do_something</span><span class="p">()</span> + <span class="nb">File</span> <span class="s2">&quot;./with_example02.py&quot;</span><span class="p">,</span> <span class="nb">line</span> <span class="mi">15</span><span class="p">,</span> <span class="k">in</span> <span class="nx">do_something</span> + <span class="n">bar</span> <span class="o">=</span> <span class="mi">1</span><span class="p">/</span><span class="nx">0</span> +<span class="nx">ZeroDivisionError</span><span class="p">:</span> <span class="kt">integer</span> <span class="nx">division</span> <span class="ow">or</span> <span class="nx">modulo</span> <span class="k">by</span> <span class="nx">zero</span> +</pre></div> + + +<p>实际上,在with后面的代码块抛出任何异常时,<strong>exit</strong>()方法被执行。正如例子所示,异常抛出时,与之关联的type,value和stack trace传给__exit__()方法,因此抛出的ZeroDivisionError异常被打印出来了。开发库时,清理资源,关闭文件等等操作,都可以放在__exit__方法当中。</p> +<p>因此,Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。 </p>python exec和eval语句2014-07-02T00:00:00+08:00Wontag:wbowam.github.io,2014-07-02:python-exeche-evalyu-ju.html<h5 id="execpythonpythonexec">exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。下面是一个简单的例子。<a class="headerlink" href="#execpythonpythonexec" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">exec</span> <span class="err">&#39;</span><span class="n">print</span> <span class="s">&quot;Hello World&quot;</span><span class="err">&#39;</span> +<span class="n">Hello</span> <span class="n">World</span> +</pre></div> + + +<h6 id="evalpython">eval语句用来计算存储在字符串中的有效Python表达式。下面是一个简单的例子。<a class="headerlink" href="#evalpython" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">eval</span><span class="p">(</span><span class="err">&#39;</span><span class="mi">2</span><span class="o">*</span><span class="mi">3</span><span class="err">&#39;</span><span class="p">)</span> +<span class="mi">6</span> +</pre></div>str()与repr()的区别2014-07-01T00:00:00+08:00Wontag:wbowam.github.io,2014-07-01:stryu-reprde-qu-bie.html<h5 id="_1">一<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">word</span><span class="o">=</span><span class="s">&quot;hello</span><span class="se">\t</span><span class="s"> world!</span><span class="se">\n</span><span class="s">hello motto!&quot;</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">str</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> +<span class="err">&#39;</span><span class="n">hello</span><span class="err">\</span><span class="n">t</span> <span class="n">world</span><span class="o">!</span><span class="err">\</span><span class="n">nhello</span> <span class="n">motto</span><span class="o">!</span><span class="err">&#39;</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">repr</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> +<span class="s">&quot;&#39;hello</span><span class="se">\\</span><span class="s">t world!</span><span class="se">\\</span><span class="s">nhello motto!&#39;&quot;</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">print</span> <span class="n">str</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> +<span class="n">hello</span> <span class="n">world</span><span class="o">!</span> +<span class="n">hello</span> <span class="n">motto</span><span class="o">!</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">print</span> <span class="n">repr</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> +<span class="err">&#39;</span><span class="n">hello</span><span class="err">\</span><span class="n">t</span> <span class="n">world</span><span class="o">!</span><span class="err">\</span><span class="n">nhello</span> <span class="n">motto</span><span class="o">!</span><span class="err">&#39;</span> +<span class="o">&gt;&gt;&gt;</span> +</pre></div> + + +<h5 id="_2">二<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">str</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span> +<span class="err">&#39;</span><span class="mf">0.1</span><span class="err">&#39;</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">repr</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span> +<span class="err">&#39;</span><span class="mf">0.10000000000000001</span><span class="err">&#39;</span> +</pre></div>Mysql语句入门(1)2014-06-19T00:00:00+08:00Wontag:wbowam.github.io,2014-06-19:mysqlyu-ju-ru-men-1.html<h3 id="_1">进入退出<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">mysql</span> <span class="o">-</span><span class="n">u</span> <span class="n">root</span> <span class="o">-</span><span class="n">p</span> +<span class="n">Enter</span> <span class="n">password</span><span class="o">:</span> + +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">quit</span> +</pre></div> + + +<h3 id="_2">创建数据库<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">mysql</span><span class="o">&gt;</span> <span class="n">CREATE</span> <span class="n">DATABASE</span> <span class="n">tulpar_db</span> <span class="n">CHARACTER</span> <span class="n">SET</span> <span class="n">utf8</span> <span class="n">COLLATE</span> <span class="n">utf8_general_ci</span><span class="p">;</span> + + +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">GRANT</span> <span class="n">ALL</span> <span class="n">ON</span> <span class="n">tulpar_db</span><span class="p">.</span><span class="o">*</span> <span class="n">TO</span> <span class="err">&#39;</span><span class="n">tulpar</span><span class="sc">&#39;@&#39;</span><span class="n">localhost</span><span class="err">&#39;</span> <span class="n">IDENTIFIED</span> <span class="n">BY</span> <span class="err">&#39;</span><span class="n">mypassword</span><span class="err">&#39;</span><span class="p">;</span> +</pre></div> + + +<h3 id="_3">导入数据库<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<h5 id="source">常用source 命令<a class="headerlink" href="#source" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">mysql</span><span class="o">&gt;</span><span class="n">use</span> <span class="n">tulpar_db</span> +<span class="n">mysql</span><span class="o">&gt;</span><span class="n">source</span> <span class="p">..</span><span class="o">/</span><span class="n">wcnc_db</span><span class="p">.</span><span class="n">sql</span> +</pre></div> + + +<h3 id="_4">导出整个数据库<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<p>mysqldump -u 用户名 -p 数据库名 &gt; 导出的文件名</p> +<div class="highlight"><pre><span class="n">mysqldump</span> <span class="o">-</span><span class="n">u</span> <span class="n">tulpar</span> <span class="o">-</span><span class="n">p</span> <span class="n">tulpar_db</span> <span class="o">&gt;</span> <span class="n">tulpar_db</span><span class="p">.</span><span class="n">sql</span> +</pre></div> + + +<h3 id="_5">删除数据库<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="nx">show</span> <span class="nx">databases</span><span class="p">;</span> +<span class="nx">DROP</span> <span class="nx">DATABASE</span> <span class="o">&lt;</span><span class="nb">databasename</span><span class="o">&gt;</span><span class="p">;</span> +</pre></div> + + +<h3 id="_6">删除数据表<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="nx">use</span> <span class="nx">tulpar_db</span><span class="p">;</span> +<span class="nx">show</span> <span class="nb">tables</span><span class="p">;</span> +<span class="nx">DROP</span> <span class="nb">TABLE</span> <span class="o">&lt;</span><span class="nb">tablename</span><span class="o">&gt;</span><span class="p">;</span> +</pre></div> + + +<h3 id="ubuntumysql">Ubuntu中配置Mysql编码<a class="headerlink" href="#ubuntumysql" title="Permanent link">&para;</a></h3> +<h5 id="_7">找到配置文件<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h5> +<p>我是通过<code>sudo apt-get install mysql</code>来安装的。mysql的配置文件在/etc/mysql/my.cnf +如果找不到这个文件,可以运行<code>sudo find / -iname ‘*.cnf’</code>查找所有的cnf文件</p> +<h5 id="_8">改配置文件<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h5> +<p>在[mysqld]下添加 +<code>default-character-set=utf8</code> +在[client]下添加 +<code>default-character-set=utf8</code></p> +<h5 id="mysql">重启mysql<a class="headerlink" href="#mysql" title="Permanent link">&para;</a></h5> +<p><code>sudo service mysql restart</code></p> +<h5 id="mysql_1">登录mysql查看是否成功<a class="headerlink" href="#mysql_1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">mysql</span> <span class="o">-</span><span class="n">u</span> <span class="n">root</span> + +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">SHOW</span> <span class="n">VARIABLES</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="kt">char</span><span class="o">%</span><span class="err">&#39;</span><span class="p">;</span> +<span class="o">+--------------------------+----------------------------+</span> +<span class="o">|</span> <span class="n">Variable_name</span> <span class="o">|</span> <span class="n">VALUE</span> <span class="o">|</span> +<span class="o">+--------------------------+----------------------------+</span> +<span class="o">|</span> <span class="n">character_set_client</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_connection</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_database</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_filesystem</span> <span class="o">|</span> <span class="n">BINARY</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_results</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_server</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_system</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_sets_dir</span> <span class="o">|</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">share</span><span class="o">/</span><span class="n">mysql</span><span class="o">/</span><span class="n">charsets</span><span class="o">/</span> <span class="o">|</span> +<span class="o">+--------------------------+----------------------------+</span> +<span class="mi">8</span> <span class="n">ROWS</span> <span class="n">IN</span> <span class="n">SET</span> <span class="p">(</span><span class="mf">0.00</span> <span class="n">sec</span><span class="p">)</span> +</pre></div> + + +<h5 id="_9">修改已经部署的数据库编码<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h5> +<p>感觉还是挺麻烦的,注意要修改数据库、表、字段的编码。</p>Django 备份数据方法(1)2014-06-18T00:00:00+08:00Wontag:wbowam.github.io,2014-06-18:django-bei-fen-shu-ju-fang-fa-1.html<h3 id="_1">如下方法:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="nx">python</span> <span class="nx">manage.py</span> <span class="nx">dumpdata</span> <span class="o">&lt;</span><span class="nx">your_app</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="nx">temp_data.json</span> +<span class="err">##做一些毁数据的活儿</span> +<span class="nx">python</span> <span class="nx">manage.py</span> <span class="nx">loaddata</span> <span class="nx">temp_data.json</span> +</pre></div>Django中使用mysql数据库2014-06-18T00:00:00+08:00Wontag:wbowam.github.io,2014-06-18:djangozhong-shi-yong-mysqlshu-ju-ku.html<h3 id="mysql">安装Mysql<a class="headerlink" href="#mysql" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">mysql</span><span class="o">-</span><span class="n">server</span> +<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">python</span><span class="o">-</span><span class="n">mysqldb</span> +<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">libmysqlclient</span><span class="o">-</span><span class="n">dev</span> +</pre></div> + + +<h3 id="mysql-python">安装<code>mysql-python</code>模块<a class="headerlink" href="#mysql-python" title="Permanent link">&para;</a></h3> +<p><code>pip install mysql-python</code> </p> +<h3 id="database">创建并设置Database<a class="headerlink" href="#database" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">mysql</span> <span class="o">-</span><span class="n">u</span> <span class="n">root</span> <span class="o">-</span><span class="n">p</span> +<span class="n">Enter</span> <span class="n">password</span><span class="o">:</span> + +<span class="cp">###mysql&gt; CREATE DATABASE tulpar_db;(最好用下面的方法,创建数据库时指定编码,免得不识别汉字</span> +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">CREATE</span> <span class="n">DATABASE</span> <span class="n">tulpar_db</span> <span class="n">CHARACTER</span> <span class="n">SET</span> <span class="n">utf8</span> <span class="n">COLLATE</span> <span class="n">utf8_general_ci</span><span class="p">;</span> + +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">GRANT</span> <span class="n">ALL</span> <span class="n">ON</span> <span class="n">tulpar_db</span><span class="p">.</span><span class="o">*</span> <span class="n">TO</span> <span class="err">&#39;</span><span class="n">tulpar</span><span class="sc">&#39;@&#39;</span><span class="n">localhost</span><span class="err">&#39;</span> <span class="n">IDENTIFIED</span> <span class="n">BY</span> <span class="err">&#39;</span><span class="n">mypassword</span><span class="err">&#39;</span><span class="p">;</span> +<span class="n">Query</span> <span class="n">OK</span><span class="p">,</span> <span class="mi">0</span> <span class="n">rows</span> <span class="n">affected</span> <span class="p">(</span><span class="mf">0.03</span> <span class="n">sec</span><span class="p">)</span> + +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">quit</span> +<span class="n">Bye</span> +</pre></div> + + +<h3 id="django-settings">设置django settings<a class="headerlink" href="#django-settings" title="Permanent link">&para;</a></h3> +<p><code>settings.py</code> </p> +<div class="highlight"><pre><span class="n">DATABASES</span> <span class="o">=</span> <span class="p">{</span> + <span class="err">&#39;</span><span class="k">default</span><span class="err">&#39;</span><span class="o">:</span> <span class="p">{</span> + <span class="err">&#39;</span><span class="n">ENGINE</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">db</span><span class="p">.</span><span class="n">backends</span><span class="p">.</span><span class="n">mysql</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">NAME</span><span class="sc">&#39;:&#39;</span><span class="n">tulpar_db</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">USER</span><span class="err">&#39;</span> <span class="o">:</span><span class="err">&#39;</span><span class="n">tulpar</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="n">Not</span> <span class="n">used</span> <span class="n">with</span> <span class="n">sqlite3</span><span class="p">.,</span> + <span class="err">&#39;</span><span class="n">PASSWORD</span><span class="err">&#39;</span> <span class="o">:</span> <span class="err">&#39;</span><span class="n">mypassword</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="n">Not</span> <span class="n">used</span> <span class="n">with</span> <span class="n">sqlite3</span><span class="p">.</span> + <span class="err">&#39;</span><span class="n">HOST</span><span class="err">&#39;</span> <span class="o">:</span> <span class="err">&#39;&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="n">Set</span> <span class="n">to</span> <span class="n">empty</span> <span class="n">string</span> <span class="k">for</span> <span class="n">localhost</span><span class="p">.</span> <span class="n">Not</span> <span class="n">used</span> <span class="n">with</span> <span class="n">sqlite3</span><span class="p">.</span> + <span class="err">&#39;</span><span class="n">PORT</span><span class="err">&#39;</span> <span class="o">:</span> <span class="err">&#39;&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="n">Set</span> <span class="n">to</span> <span class="n">empty</span> <span class="n">string</span> <span class="k">for</span> <span class="k">default</span><span class="p">.</span> <span class="n">Not</span> <span class="n">used</span> <span class="n">with</span> <span class="n">sqlite3</span><span class="p">.</span> + <span class="p">}</span> +<span class="p">}</span> +</pre></div> + + +<h3 id="_1">生成数据<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p><code>python manage.py syncdb</code><br /> +<code>python manage.py runserver</code> </p>Xadmin List_display中显示缩略图2014-06-18T00:00:00+08:00Wontag:wbowam.github.io,2014-06-18:xadmin-list_displayzhong-xian-shi-suo-lue-tu.html<h3 id="_1">需求如图:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p><img alt="Xadmin环境中" src="http://tulparblog.qiniudn.com/%E7%BC%A9%E7%95%A5%E5%9B%BE.png" /></p> +<h3 id="_2">方法:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p><code>models.py</code> </p> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">User</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">translation</span> <span class="n">import</span> <span class="n">ugettext</span> <span class="n">as</span> <span class="n">_</span> +<span class="n">from</span> <span class="n">userena</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">UserenaBaseProfile</span> + +<span class="n">class</span> <span class="n">MyProfile</span><span class="p">(</span><span class="n">UserenaBaseProfile</span><span class="p">)</span><span class="o">:</span> + <span class="n">user</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span><span class="n">unique</span><span class="o">=</span><span class="n">True</span><span class="p">,</span><span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">),</span><span class="n">related_name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">my_profile</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">one_card</span><span class="o">=</span><span class="n">models</span><span class="p">.</span><span class="n">FileField</span><span class="p">(</span><span class="n">u</span><span class="err">&#39;一卡通&#39;</span><span class="p">,</span><span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">,</span><span class="n">blank</span><span class="o">=</span><span class="n">True</span><span class="p">,</span><span class="n">upload_to</span><span class="o">=</span><span class="err">&#39;</span><span class="n">onecard</span><span class="err">&#39;</span><span class="p">)</span> + +<span class="cp">#########################关键是如下函数</span> + <span class="n">def</span> <span class="n">image_img</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">one_card</span><span class="o">:</span> + <span class="k">return</span> <span class="n">str</span><span class="p">(</span><span class="err">&#39;</span><span class="o">&lt;</span><span class="n">img</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;%s&quot;</span> <span class="o">/&gt;</span><span class="err">&#39;</span> <span class="o">%</span> <span class="n">self</span><span class="p">.</span><span class="n">one_card</span><span class="p">.</span><span class="n">url</span><span class="p">)</span> + <span class="nl">else:</span> + <span class="k">return</span> <span class="n">u</span><span class="err">&#39;上传头像&#39;</span> + <span class="n">image_img</span><span class="p">.</span><span class="n">short_description</span> <span class="o">=</span> <span class="err">&#39;头像&#39;</span> + <span class="n">image_img</span><span class="p">.</span><span class="n">allow_tags</span> <span class="o">=</span> <span class="n">True</span> +</pre></div> + + +<p><code>adminx.py</code> </p> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> + +<span class="cp"># Register your models here.</span> +<span class="n">import</span> <span class="n">xadmin</span> + +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">MyProfile</span> + +<span class="n">class</span> <span class="n">MyProfileAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="sc">&#39;,&#39;</span><span class="n">favourite_snack</span><span class="sc">&#39;,&#39;</span><span class="n">image_img</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">list_display_links</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="sc">&#39;,&#39;</span><span class="n">image_img</span><span class="err">&#39;</span><span class="p">)</span> + +<span class="n">xadmin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">MyProfile</span><span class="p">,</span><span class="n">MyProfileAdmin</span><span class="p">)</span> +</pre></div> + + +<h3 id="_3">效果图如下:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<p><img alt="太大了" src="http://tulparblog.qiniudn.com/%E6%95%88%E6%9E%9C%E5%9B%BE.png" /></p> +<hr /> +<h4 id="_4">很显然,该控制一下上传的图片了<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h4> +<p>使用<a href="https://github.com/tulpar008/django-stdimage">django-stdimage</a>解决此问题</p> +<h4 id="_5">安装<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4> +<h6 id="pil">得有PIL哦<a class="headerlink" href="#pil" title="Permanent link">&para;</a></h6> +<p><code>pip install django-stdimage</code> <br /> +添加‘stdimage’至‘INSTALLED_APPS’</p> +<h3 id="_6">使用<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3> +<h5 id="modelspy"><code>models.py</code><a class="headerlink" href="#modelspy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">User</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">translation</span> <span class="n">import</span> <span class="n">ugettext</span> <span class="n">as</span> <span class="n">_</span> +<span class="n">from</span> <span class="n">userena</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">UserenaBaseProfile</span> + +<span class="cp">#########################关键StdImageField()</span> +<span class="n">class</span> <span class="n">MyProfile</span><span class="p">(</span><span class="n">UserenaBaseProfile</span><span class="p">)</span><span class="o">:</span> + <span class="n">user</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span><span class="n">unique</span><span class="o">=</span><span class="n">True</span><span class="p">,</span><span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">),</span><span class="n">related_name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">my_profile</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">one_card</span><span class="o">=</span><span class="n">StdImageField</span><span class="p">(</span><span class="n">upload_to</span><span class="o">=</span><span class="err">&#39;</span><span class="n">onecard</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">variations</span><span class="o">=</span><span class="p">{</span><span class="err">&#39;</span><span class="n">thumbnail</span><span class="err">&#39;</span><span class="o">:</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">75</span><span class="p">)})</span> <span class="err">#</span> <span class="n">creates</span> <span class="n">a</span> <span class="n">thumbnail</span> <span class="n">resized</span> <span class="n">to</span> <span class="n">maximum</span> <span class="n">size</span> <span class="n">to</span> <span class="n">fit</span> <span class="n">a</span> <span class="mi">100</span><span class="n">x75</span> <span class="n">area</span> + +<span class="cp">#########################关键self.one_card.thumbnail.url</span> + <span class="n">def</span> <span class="n">image_img</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">one_card</span><span class="o">:</span> + <span class="k">return</span> <span class="n">str</span><span class="p">(</span><span class="err">&#39;</span><span class="o">&lt;</span><span class="n">img</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;%s&quot;</span> <span class="o">/&gt;</span><span class="err">&#39;</span> <span class="o">%</span> <span class="n">self</span><span class="p">.</span><span class="n">one_card</span><span class="p">.</span><span class="n">thumbnail</span><span class="p">.</span><span class="n">url</span><span class="p">)</span> + <span class="nl">else:</span> + <span class="k">return</span> <span class="n">u</span><span class="err">&#39;上传头像&#39;</span> + <span class="n">image_img</span><span class="p">.</span><span class="n">short_description</span> <span class="o">=</span> <span class="err">&#39;头像&#39;</span> + <span class="n">image_img</span><span class="p">.</span><span class="n">allow_tags</span> <span class="o">=</span> <span class="n">True</span> +</pre></div> + + +<h5 id="adminxpy"><code>adminx.py</code>不用做任何变化<a class="headerlink" href="#adminxpy" title="Permanent link">&para;</a></h5> +<h3 id="_7">效果图如下:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h3> +<p><img alt="最终完美效果" src="http://tulparblog.qiniudn.com/%E6%9C%80%E7%BB%88%E6%95%88%E6%9E%9C.png" /></p>Xadmin中自动预填某个字段2014-06-16T00:00:00+08:00Wontag:wbowam.github.io,2014-06-16:xadminzhong-zi-dong-yu-tian-mou-ge-zi-duan.html<h3 id="_1">需求:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>今天写一个model时写了个字段<code>create_by=models.ForeignKey(User)</code>。 <br /> +想给它预填入当前的已登录用户。需求类似如下(当然不可能那样写): <br /> +<code>created_by = models.ForeignKey(User, default=request.user)</code><br /> +如果以上需求在<code>View</code>里,很好解决的。可现在在AdminModel里,而且在Xadmin环境下。<br /> +于是,Google,得<a href="http://stackoverflow.com/questions/937954/how-do-you-specify-a-default-for-a-django-foreignkey-model-or-adminmodel-field">StackOverFlow</a>,找到了<a href="http://www.b-list.org/weblog/2008/dec/24/admin/">参考资料1</a>。感谢Google,感谢StackOverFlowx,感谢<a href="http://www.b-list.org/weblog/2008/dec/24/admin/">参考资料1</a>。<a href="https://github.com/sshwsfc/django-xadmin/issues/96">参考资料2</a></p> +<h3 id="_2">解决方案<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<h4 id="django-admin">在默认的django admin环境下<a class="headerlink" href="#django-admin" title="Permanent link">&para;</a></h4> +<h5 id="modelspy"><code>models.py</code><a class="headerlink" href="#modelspy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">User</span> + +<span class="n">class</span> <span class="n">Kuaijian</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">created_by</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">User</span><span class="p">)</span> +</pre></div> + + +<h5 id="adminpy"><code>admin.py</code><a class="headerlink" href="#adminpy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span> <span class="n">import</span> <span class="n">admin</span> +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">Kuaijian</span> + +<span class="n">class</span> <span class="n">KuaijianAdmin</span><span class="p">(</span><span class="n">admin</span><span class="p">.</span><span class="n">ModelAdmin</span><span class="p">)</span><span class="o">:</span> + <span class="n">exclude</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">author</span><span class="err">&#39;</span><span class="p">,)</span><span class="err">##</span> +<span class="cp">###主要是如下函数的OverWrite</span> + <span class="n">def</span> <span class="n">save_model</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="n">change</span><span class="p">)</span><span class="o">:</span> + <span class="k">if</span> <span class="n">not</span> <span class="n">change</span><span class="o">:</span> + <span class="n">obj</span><span class="p">.</span><span class="n">created_by</span> <span class="o">=</span> <span class="n">request</span><span class="p">.</span><span class="n">user</span> + <span class="n">obj</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> + +<span class="n">admin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">Kuaijian</span><span class="p">,</span><span class="n">KuaijianAdmin</span><span class="p">)</span> +</pre></div> + + +<h4 id="xadmin">在Xadmin的环境下<a class="headerlink" href="#xadmin" title="Permanent link">&para;</a></h4> +<h5 id="modelspy_1"><code>models.py</code>跟上述的一样<a class="headerlink" href="#modelspy_1" title="Permanent link">&para;</a></h5> +<h5 id="adminxpy"><code>adminx.py</code><a class="headerlink" href="#adminxpy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">class</span> <span class="n">KuaijianAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">exclude</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">author</span><span class="err">&#39;</span><span class="p">,)</span><span class="err">##</span> +<span class="cp">###主要是如下函数的OverWrite</span> + <span class="n">def</span> <span class="n">save_models</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="n">self</span><span class="p">.</span><span class="n">new_obj</span><span class="p">.</span><span class="n">created_by</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="n">request</span><span class="p">.</span><span class="n">user</span> + <span class="n">self</span><span class="p">.</span><span class="n">new_obj</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +</pre></div>Ueditor在Django中的使用2014-06-14T00:00:00+08:00Wontag:wbowam.github.io,2014-06-14:ueditorzai-djangozhong-de-shi-yong.html<p>以前写过Ueditor在Django中的使用方法(虽然跟着上一个博客一起丢了),在此不赘述了。想学可以看看这位朋友的分享: +<a href="https://github.com/zhangfisher/DjangoUeditor">Django中使用Ueditor</a></p> +<p><a href="http://mushapi.sinaapp.com/using-ueditor-in-django-with-xadmin.html">http://mushapi.sinaapp.com/using-ueditor-in-django-with-xadmin.html</a></p> +<h3 id="1">1.安装<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<p><code>pip install DjangoUeditor</code></p> +<h3 id="2">2.启用<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<h5 id="install_appsdjangoueditor-app">在<code>INSTALL_APPS</code>里面增加DjangoUeditor app,如下:<a class="headerlink" href="#install_appsdjangoueditor-app" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">INSTALLED_APPS</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">#</span><span class="p">........</span> + <span class="err">&#39;</span><span class="n">DjangoUeditor</span><span class="err">&#39;</span><span class="p">,</span> + <span class="p">)</span> +</pre></div> + + +<h5 id="urlspy">在urls.py中增加:<a class="headerlink" href="#urlspy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre> <span class="n">url</span><span class="p">(</span><span class="n">r</span><span class="err">&#39;</span><span class="o">^</span><span class="n">ueditor</span><span class="o">/</span><span class="err">&#39;</span><span class="p">,</span><span class="n">include</span><span class="p">(</span><span class="err">&#39;</span><span class="n">DjangoUeditor</span><span class="p">.</span><span class="n">urls</span><span class="err">&#39;</span> <span class="p">)),</span> +</pre></div> + + +<h3 id="3">3.使用<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3> +<h5 id="models">在<code>models</code>中这样使用:<a class="headerlink" href="#models" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">DjangoUeditor</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">UEditorField</span> + <span class="n">class</span> <span class="n">Blog</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">Name</span><span class="o">=</span><span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(,</span><span class="n">max_length</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span><span class="n">blank</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + <span class="n">Content</span><span class="o">=</span><span class="n">UEditorField</span><span class="p">(</span><span class="n">u</span><span class="err">&#39;内容</span> <span class="err">&#39;</span><span class="p">,</span><span class="n">height</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span><span class="n">width</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span><span class="k">default</span><span class="o">=</span><span class="err">&#39;</span><span class="n">test</span><span class="err">&#39;</span><span class="p">,</span><span class="n">imagePath</span><span class="o">=</span><span class="s">&quot;uploadimg/&quot;</span><span class="p">,</span><span class="n">imageManagerPath</span><span class="o">=</span><span class="s">&quot;imglib&quot;</span><span class="p">,</span><span class="n">toolbars</span><span class="o">=</span><span class="err">&#39;</span><span class="n">mini</span><span class="err">&#39;</span><span class="p">,</span><span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;elementPathEnabled&quot;</span><span class="o">:</span><span class="n">True</span><span class="p">},</span><span class="n">filePath</span><span class="o">=</span><span class="err">&#39;</span><span class="n">upload</span><span class="err">&#39;</span><span class="p">,</span><span class="n">blank</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + +<span class="err">&#39;&#39;&#39;</span> +<span class="err">说明:</span> + <span class="n">UEditorField</span><span class="err">继承自</span><span class="n">models</span><span class="p">.</span><span class="n">TextField</span><span class="p">,</span><span class="err">因此你可以直接将</span><span class="n">model</span><span class="err">里面定义的</span><span class="n">models</span><span class="p">.</span><span class="n">TextField</span><span class="err">直接改成</span><span class="n">UEditorField</span><span class="err">即可。</span> + <span class="n">UEditorField</span><span class="err">提供了额外的参数:</span> + <span class="nl">toolbars:</span><span class="err">配置你想显示的工具栏,取值为</span><span class="n">mini</span><span class="p">,</span><span class="n">normal</span><span class="p">,</span><span class="n">full</span><span class="err">,代表小,一般,全部。如果默认的工具栏不符合您的要求,您可以在</span><span class="n">settings</span><span class="err">里面配置自己的显示按钮。参见后面介绍。</span> + <span class="nl">imagePath:</span><span class="err">图片上传的路径</span><span class="p">,</span><span class="err">如</span><span class="s">&quot;images/&quot;</span><span class="p">,</span><span class="err">实现上传到</span><span class="s">&quot;{{MEDIA_ROOT}}/images&quot;</span><span class="err">文件夹</span> + <span class="nl">filePath:</span><span class="err">附件上传的路径</span><span class="p">,</span><span class="err">如</span><span class="s">&quot;files/&quot;</span><span class="p">,</span><span class="err">实现上传到</span><span class="s">&quot;{{MEDIA_ROOT}}/files&quot;</span><span class="err">文件夹</span> + <span class="nl">scrawlPath:</span><span class="err">涂鸦文件上传的路径</span><span class="p">,</span><span class="err">如</span><span class="s">&quot;scrawls/&quot;</span><span class="p">,</span><span class="err">实现上传到</span><span class="s">&quot;{{MEDIA_ROOT}}/scrawls&quot;</span><span class="err">文件夹</span><span class="p">,</span><span class="err">如果不指定则默认</span><span class="o">=</span><span class="n">imagepath</span> + <span class="nl">imageManagerPath:</span><span class="err">图片管理器显示的路径,如</span><span class="s">&quot;imglib/&quot;</span><span class="p">,</span><span class="err">实现上传到</span><span class="s">&quot;{{MEDIA_ROOT}}/imglib&quot;</span><span class="p">,</span><span class="err">如果不指定则默认</span><span class="o">=</span><span class="n">imagepath</span><span class="err">。</span> + <span class="n">options</span><span class="err">:其他</span><span class="n">UEditor</span><span class="err">参数,字典类型。参见</span><span class="n">Ueditor</span><span class="err">的文档`</span><span class="n">ueditor_config</span><span class="p">.</span><span class="n">js</span><span class="err">`里面的说明。</span> + <span class="nl">css:</span><span class="err">编辑器</span><span class="n">textarea</span><span class="err">的</span><span class="n">CSS</span><span class="err">样式</span> + <span class="n">width</span><span class="err">,</span><span class="n">height</span><span class="o">:</span><span class="err">编辑器的宽度和高度,以像素为单位。</span> +<span class="err">&#39;&#39;&#39;</span> +</pre></div> + + +<h5 id="csrf_token">在表单中使用,如下:(使用表单时注意{% csrf_token %})<a class="headerlink" href="#csrf_token" title="Permanent link">&para;</a></h5> +<p>在ModelForm中:(Ueditor的配置来自Model,所以在此不需import)</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">TestUeditorModelForm</span><span class="p">(</span><span class="n">forms</span><span class="p">.</span><span class="n">ModelForm</span><span class="p">)</span><span class="o">:</span> + <span class="n">class</span> <span class="n">Meta</span><span class="o">:</span> + <span class="n">model</span><span class="o">=</span><span class="n">Blog</span> +</pre></div> + + +<p>在普通Form中:</p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">DjangoUeditor</span><span class="p">.</span><span class="n">forms</span> <span class="n">import</span> <span class="n">UEditorField</span> + <span class="n">class</span> <span class="n">TestUEditorForm</span><span class="p">(</span><span class="n">forms</span><span class="p">.</span><span class="n">Form</span><span class="p">)</span><span class="o">:</span> + <span class="n">Description</span><span class="o">=</span><span class="n">UEditorField</span><span class="p">(</span><span class="s">&quot;描述&quot;</span><span class="p">,</span><span class="n">initial</span><span class="o">=</span><span class="s">&quot;abc&quot;</span><span class="p">,</span><span class="n">width</span><span class="o">=</span><span class="mi">600</span><span class="p">,</span><span class="n">height</span><span class="o">=</span><span class="mi">800</span><span class="p">)</span> +</pre></div> + + +<h5 id="_1">在模板里面使用:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="nt">&lt;head&gt;</span> + ...... + {{ form.media }} #这一句会将所需要的CSS和JS加进来。 + ...... + <span class="nt">&lt;/head&gt;</span> +</pre></div> + + +<div class="highlight"><pre><span class="o">**</span><span class="err">注:运行</span><span class="n">collectstatic</span><span class="err">命令,将所依赖的</span><span class="n">css</span><span class="p">,</span><span class="n">js</span><span class="err">之类的文件复制到</span><span class="p">{{</span><span class="n">STATIC_ROOT</span><span class="p">}}</span><span class="err">文件夹里面。</span><span class="o">**</span> +</pre></div> + + +<h3 id="4">4.定制<a class="headerlink" href="#4" title="Permanent link">&para;</a></h3> +<h5 id="settingpy">在<code>setting.py</code>中配置:<a class="headerlink" href="#settingpy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">UEDITOR_SETTINGS</span><span class="o">=</span><span class="p">{</span> + <span class="s">&quot;toolbars&quot;</span><span class="o">:</span><span class="p">{</span> <span class="err">#定义多个工具栏显示的按钮,允行定义多个</span> + <span class="s">&quot;name1&quot;</span><span class="o">:</span><span class="p">[[</span> <span class="err">&#39;</span><span class="n">source</span><span class="err">&#39;</span><span class="p">,</span> <span class="sc">&#39;|&#39;</span><span class="p">,</span><span class="err">&#39;</span><span class="n">bold</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">italic</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">underline</span><span class="err">&#39;</span><span class="p">]],</span> + <span class="s">&quot;name2&quot;</span><span class="p">,[]</span> + <span class="p">},</span> + <span class="s">&quot;images_upload&quot;</span><span class="o">:</span><span class="p">{</span> + <span class="s">&quot;allow_type&quot;</span><span class="o">:</span><span class="s">&quot;jpg,png&quot;</span><span class="p">,</span> <span class="err">#定义允许的上传的图片类型</span> + <span class="s">&quot;path&quot;</span><span class="o">:</span><span class="s">&quot;&quot;</span><span class="p">,</span> <span class="err">#定义默认的上传路径</span> + <span class="s">&quot;max_size&quot;</span><span class="o">:</span><span class="s">&quot;2222kb&quot;</span> <span class="err">#定义允许上传的图片大小,</span><span class="mi">0</span><span class="err">代表不限制</span> + <span class="p">},</span> + <span class="s">&quot;files_upload&quot;</span><span class="o">:</span><span class="p">{</span> + <span class="s">&quot;allow_type&quot;</span><span class="o">:</span><span class="s">&quot;zip,rar&quot;</span><span class="p">,</span> <span class="err">#定义允许的上传的文件类型</span> + <span class="s">&quot;path&quot;</span><span class="o">:</span><span class="s">&quot;&quot;</span> <span class="err">#定义默认的上传路径</span> + <span class="s">&quot;max_size&quot;</span><span class="o">:</span><span class="s">&quot;2222kb&quot;</span> <span class="err">#定义允许上传的文件大小,</span><span class="mi">0</span><span class="err">代表不限制</span> + <span class="p">},,</span> + <span class="s">&quot;image_manager&quot;</span><span class="o">:</span><span class="p">{</span> + <span class="s">&quot;path&quot;</span><span class="o">:</span><span class="s">&quot;&quot;</span> <span class="err">#图片管理器的位置</span><span class="p">,</span><span class="err">如果没有指定,默认跟图片路径上传一样</span> + <span class="p">},</span> + <span class="s">&quot;scrawl_upload&quot;</span><span class="o">:</span><span class="p">{</span> + <span class="s">&quot;path&quot;</span><span class="o">:</span><span class="s">&quot;&quot;</span> <span class="err">#涂鸦图片默认的上传路径</span> + <span class="p">}</span> + <span class="p">}</span> +</pre></div>Xadmin入门(2)2014-06-13T00:00:00+08:00Wontag:wbowam.github.io,2014-06-13:xadminru-men-2.html<h2 id="xadmin">Xadmin 的插件介绍<a class="headerlink" href="#xadmin" title="Permanent link">&para;</a></h2> +<p>(本来想自己总结一遍的,可太喜欢Xadmin的文档了,言简意赅,排版精美,就直接搬了,望大侠们勿喷)</p> +<h3 id="1-action">1. Action<a class="headerlink" href="#1-action" title="Permanent link">&para;</a></h3> +<h4 id="_1">功能<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<p>Action 插件在数据列表页面提供了数据选择功能, 选择后的数据可以经过 Action 做特殊的处理. 默认提供的 Action 为批量删除功能.</p> +<h4 id="_2">截图<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p><img alt="Action" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/action.png" /></p> +<h4 id="_3">使用<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4> +<p>开发者可以设置 Model OptionClass 的 actions 属性, 该属性是一个列表, 包含您想启用的 Action 的类. 系统已经默认内置了删除数据的 Action, 当然您可以自己制作 Action 来实现特定的功能, 制作 Action 的实例如下.</p> +<p>首先要创建一个 Action 类, 该类需要继承 BaseActionView. BaseActionView 是 ModelAdminView 的子类:</p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">xadmin</span><span class="p">.</span><span class="n">plugins</span><span class="p">.</span><span class="n">actions</span> <span class="n">import</span> <span class="n">BaseActionView</span> + +<span class="n">class</span> <span class="n">MyAction</span><span class="p">(</span><span class="n">BaseActionView</span><span class="p">)</span><span class="o">:</span> + + <span class="err">#</span> <span class="err">这里需要填写三个属性</span> + <span class="n">action_name</span> <span class="o">=</span> <span class="s">&quot;my_action&quot;</span> <span class="err">#</span><span class="o">:</span> <span class="err">相当于这个</span> <span class="n">Action</span> <span class="err">的唯一标示</span><span class="p">,</span> <span class="err">尽量用比较针对性的名字</span> + <span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="n">u</span><span class="err">&#39;</span><span class="n">Test</span> <span class="n">selected</span> <span class="o">%</span><span class="p">(</span><span class="n">verbose_name_plural</span><span class="p">)</span><span class="n">s</span><span class="err">&#39;</span><span class="p">)</span> <span class="err">#</span><span class="o">:</span> <span class="err">描述</span><span class="p">,</span> <span class="err">出现在</span> <span class="n">Action</span> <span class="err">菜单中</span><span class="p">,</span> <span class="err">可以使用</span> <span class="err">``</span><span class="o">%</span><span class="p">(</span><span class="n">verbose_name_plural</span><span class="p">)</span><span class="n">s</span><span class="err">``</span> <span class="err">代替</span> <span class="n">Model</span> <span class="err">的名字</span><span class="p">.</span> + + <span class="n">model_perm</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">change</span><span class="err">&#39;</span> <span class="err">#</span><span class="o">:</span> <span class="err">该</span> <span class="n">Action</span> <span class="err">所需权限</span> + + <span class="err">#</span> <span class="err">而后实现</span> <span class="n">do_action</span> <span class="err">方法</span> + <span class="n">def</span> <span class="n">do_action</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">queryset</span><span class="p">)</span><span class="o">:</span> + <span class="err">#</span> <span class="n">queryset</span> <span class="err">是包含了已经选择的数据的</span> <span class="n">queryset</span> + <span class="k">for</span> <span class="n">obj</span> <span class="n">in</span> <span class="n">queryset</span><span class="o">:</span> + <span class="err">#</span> <span class="n">obj</span> <span class="err">的操作</span> + <span class="p">...</span> + <span class="err">#</span> <span class="err">返回</span> <span class="n">HttpResponse</span> + <span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(...)</span> +</pre></div> + + +<p>然后在 Model 的 OptionClass 中使用这个 Action:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">MyModelAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + + <span class="n">actions</span> <span class="o">=</span> <span class="p">[</span><span class="n">MyAction</span><span class="p">,</span> <span class="p">]</span> +</pre></div> + + +<p>这样就完成了自己的 Action</p> +<h4 id="api">API<a class="headerlink" href="#api" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">class</span> <span class="n">xadmin</span><span class="p">.</span><span class="n">plugins</span><span class="p">.</span><span class="n">actions</span><span class="p">.</span><span class="n">ActionPlugin</span><span class="p">(</span><span class="n">admin_view</span><span class="p">)</span> +</pre></div> + + +<h4 id="_4">我的效果如下: <a href="https://github.com/tulpar008/testing_Xadmin">我的源码在此</a><a class="headerlink" href="#_4" title="Permanent link">&para;</a></h4> +<p><img alt="Action" src="http://tulparblog.qiniudn.com/xadmin2action.png" /></p> +<h3 id="2">2. 数据过滤器<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<h4 id="_5">功能<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4> +<p>在数据列表页面提供数据过滤功能, 包括: 模糊搜索, 数字范围搜索, 日期搜索等等</p> +<h4 id="_6">截图<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h4> +<p><img alt="数据过滤器" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/filter.png" /></p> +<h4 id="_7">使用<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h4> +<p>在 Model OptionClass 中设置以下属性: </p> +<p><code>list_filter</code> 属性: </p> +<p>该属性指定可以过滤的列的名字, 系统会自动生成搜索器 </p> +<p><code>search_fields</code> 属性: </p> +<p>属性指定可以通过搜索框搜索的数据列的名字, 搜索框搜索使用的是模糊查找的方式, 一般用来搜素名字等字符串字段 </p> +<p><code>free_query_filter</code> 属性: </p> +<p>默认为 True , 指定是否可以自由搜索. 如果开启自有搜索, 用户可以通过 url 参数来进行特定的搜索, 例如: </p> +<p><code>http://xxx.com/xadmin/auth/user/?name__contains=tony</code> +使用过滤器的例子: </p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">UserAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">list_filter</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">is_staff</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">is_superuser</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">is_active</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">search_fields</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">username</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">first_name</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">last_name</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">email</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h4 id="_8">制作过滤器<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h4> +<p>您也可以制作自己的过滤器, 用来进行一些特定的过滤. 过滤器需要继承 <code>xadmin.filters.BaseFilter</code> 类, 并使用 <code>xadmin.filters.manager</code> 注册过滤器.</p> +<h4 id="_9"><a href="https://github.com/tulpar008/testing_Xadmin/tree/master">我的源码在此</a> 我的效果如下<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h4> +<p><img alt="数据过滤" src="http://tulparblog.qiniudn.com/xadmin2%E6%95%B0%E6%8D%AE%E8%BF%87%E6%BB%A4%E5%99%A8.png" /></p> +<h3 id="3">3. 图表插件<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3> +<h4 id="_10">功能<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h4> +<p>在数据列表页面, 跟列表数据生成图表. 可以指定多个数据列, 生成多个图表.</p> +<h4 id="_11">截图<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h4> +<p><img alt="图表" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/chart.png" /></p> +<h4 id="_12">使用<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h4> +<p>在 Model OptionClass 中设定 data_charts 属性, 该属性为 dict 类型, key 是图表的标示名称, value 是图表的具体设置属性. 使用示例: </p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">RecordAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">data_charts</span> <span class="o">=</span> <span class="p">{</span> + <span class="s">&quot;user_count&quot;</span><span class="o">:</span> <span class="p">{</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">u</span><span class="s">&quot;User Report&quot;</span><span class="p">,</span> <span class="s">&quot;x-field&quot;</span><span class="o">:</span> <span class="s">&quot;date&quot;</span><span class="p">,</span> <span class="s">&quot;y-field&quot;</span><span class="o">:</span> <span class="p">(</span><span class="s">&quot;user_count&quot;</span><span class="p">,</span> <span class="s">&quot;view_count&quot;</span><span class="p">),</span> <span class="s">&quot;order&quot;</span><span class="o">:</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">date</span><span class="err">&#39;</span><span class="p">,)},</span> + <span class="s">&quot;avg_count&quot;</span><span class="o">:</span> <span class="p">{</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">u</span><span class="s">&quot;Avg Report&quot;</span><span class="p">,</span> <span class="s">&quot;x-field&quot;</span><span class="o">:</span> <span class="s">&quot;date&quot;</span><span class="p">,</span> <span class="s">&quot;y-field&quot;</span><span class="o">:</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">avg_count</span><span class="err">&#39;</span><span class="p">,),</span> <span class="s">&quot;order&quot;</span><span class="o">:</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">date</span><span class="err">&#39;</span><span class="p">,)}</span> + <span class="p">}</span> +</pre></div> + + +<p>图表的主要属性为: </p> +<p><code>title</code> : 图表的显示名称 </p> +<p><code>x-field</code> : 图表的 X 轴数据列, 一般是日期, 时间等 </p> +<p><code>y-field</code> : 图表的 Y 轴数据列, 该项是一个 list, 可以同时设定多个列, 这样多个列的数据会在同一个图表中显示 </p> +<p><code>order</code> : 排序信息, 如果不写则使用数据列表的排序 </p> +<h4 id="api_1">API<a class="headerlink" href="#api_1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">class</span> <span class="n">xadmin</span><span class="p">.</span><span class="n">plugins</span><span class="p">.</span><span class="n">chart</span><span class="p">.</span><span class="n">ChartsPlugin</span><span class="p">(</span><span class="n">admin_view</span><span class="p">)[</span><span class="n">source</span><span class="p">]</span> +<span class="n">class</span> <span class="n">xadmin</span><span class="p">.</span><span class="n">plugins</span><span class="p">.</span><span class="n">chart</span><span class="p">.</span><span class="n">ChartsView</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)[</span><span class="n">source</span><span class="p">]</span><span class="err">¶</span> +</pre></div> + + +<h4 id="_13">我的效果图:不知怎么也没弄出图表。。。。。<a href="https://github.com/tulpar008/testing_Xadmin/tree/master">我的代码在此</a><a class="headerlink" href="#_13" title="Permanent link">&para;</a></h4> +<p><img alt="图表" src="http://tulparblog.qiniudn.com/xadmin2%E5%9B%BE%E8%A1%A8%E6%8F%92%E4%BB%B6.png" /></p> +<h3 id="4">4.数据导出<a class="headerlink" href="#4" title="Permanent link">&para;</a></h3> +<h4 id="_14">功能<a class="headerlink" href="#_14" title="Permanent link">&para;</a></h4> +<p>该插件在数据列表页面提供了数据导出功能, 可以导出 <code>Excel</code>, <code>CSV</code>, <code>XML</code>, <code>json</code> 格式. </p> +<h4 id="_15">截图<a class="headerlink" href="#_15" title="Permanent link">&para;</a></h4> +<p><img alt="数据导出" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/export.png" /></p> +<h4 id="_16">使用<a class="headerlink" href="#_16" title="Permanent link">&para;</a></h4> +<h6 id="note-excel-xlwt">Note:如果想要导出 Excel 数据, 需要安装 xlwt.<a class="headerlink" href="#note-excel-xlwt" title="Permanent link">&para;</a></h6> +<p>默认情况下, xadmin 会提供 Excel, CSV, XML, json 四种格式的数据导出. 您可以通过设置 OptionClass 的 list_export 属性来指定使用 哪些导出格式 (四种各使用分别用 xls, csv, xml, json 表示), 或是将 list_export 设置为 None 来禁用数据导出功能. 示例如下:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">MyModelAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + + <span class="n">list_export</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">xls</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">xml</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">json</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h4 id="_17">我的效果图:不知怎么也没弄出图表。。。。。<a href="https://github.com/tulpar008/testing_Xadmin/tree/master">我的代码在此</a><a class="headerlink" href="#_17" title="Permanent link">&para;</a></h4> +<p><img alt="数据导出" src="http://tulparblog.qiniudn.com/xadmin2%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%87%BA.png" /></p> +<h3 id="5">5. 列表定时刷新<a class="headerlink" href="#5" title="Permanent link">&para;</a></h3> +<h4 id="_18">功能<a class="headerlink" href="#_18" title="Permanent link">&para;</a></h4> +<p>该插件在数据列表页面提供了定时刷新功能, 对于需要实时刷新列表页面查看即时数据的情况非常有用.</p> +<h4 id="_19">截图<a class="headerlink" href="#_19" title="Permanent link">&para;</a></h4> +<p><img alt="列表刷新" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/refresh.png" /></p> +<h4 id="_20">使用<a class="headerlink" href="#_20" title="Permanent link">&para;</a></h4> +<p>使用数据刷新插件非常简单, 设置 OptionClass 的 refresh_times 属性即可. refresh_times 属性是存有刷新时间的数组. xadmin 默认不开启该插件. 示例如下:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">MyModelAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + + <span class="err">#</span> <span class="err">这会显示一个下拉列表</span><span class="p">,</span> <span class="err">用户可以选择</span><span class="mi">3</span><span class="err">秒或</span><span class="mi">5</span><span class="err">秒刷新一次页面</span><span class="p">.</span> + <span class="n">refresh_times</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> +</pre></div> + + +<h4 id="_21">我的效果图:<a href="https://github.com/tulpar008/testing_Xadmin/tree/master">我的代码在此</a><a class="headerlink" href="#_21" title="Permanent link">&para;</a></h4> +<p><img alt="刷新" src="http://tulparblog.qiniudn.com/xadmin2%E5%88%B7%E6%96%B0.png" /></p> +<h3 id="6">6. 显示数据详情<a class="headerlink" href="#6" title="Permanent link">&para;</a></h3> +<h4 id="_22">功能<a class="headerlink" href="#_22" title="Permanent link">&para;</a></h4> +<p>该插件可以在列表页中显示相关字段的详细信息, 使用 Ajax 在列表页中显示.</p> +<h4 id="_23">截图<a class="headerlink" href="#_23" title="Permanent link">&para;</a></h4> +<p><img alt="数据详情" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/details.png" /></p> +<h4 id="_24">使用<a class="headerlink" href="#_24" title="Permanent link">&para;</a></h4> +<p>使用该插件主要设置 <code>OptionClass</code> 的 <code>show_detail_fields</code>, <code>show_all_rel_details</code> 两个属性. <code>show_detail_fields</code> 属性设置哪些字段要显示详细信息, <code>show_all_rel_details</code> 属性设置时候自动显示所有关联字段的详细信息, 该属性默认为 <code>True</code>. 示例如下:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">MyModelAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + + <span class="n">show_detail_fields</span> <span class="o">=</span> <span class="p">[</span><span class="err">&#39;</span><span class="n">group</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">father</span><span class="err">&#39;</span><span class="p">,</span> <span class="p">...]</span> +</pre></div> + + +<h4 id="_25">每弄出来啊<a class="headerlink" href="#_25" title="Permanent link">&para;</a></h4> +<h3 id="7">7. 数据即时编辑<a class="headerlink" href="#7" title="Permanent link">&para;</a></h3> +<h4 id="_26">功能<a class="headerlink" href="#_26" title="Permanent link">&para;</a></h4> +<p>该插件可以在列表页中即时编辑某字段的值, 使用 Ajax 技术, 无需提交或刷新页面即可完成数据的修改, 对于需要频繁修改的字段(如: 状态)相当有用.</p> +<h4 id="_27">截图<a class="headerlink" href="#_27" title="Permanent link">&para;</a></h4> +<p><img alt="即时编辑" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/editable.png" /></p> +<h4 id="_28">使用<a class="headerlink" href="#_28" title="Permanent link">&para;</a></h4> +<p>使用该插件主要设置 OptionClass 的 list_editable 属性. list_editable 属性设置哪些字段需要即时修改功能. 示例如下:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">MyModelAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + + <span class="n">list_editable</span> <span class="o">=</span> <span class="p">[</span><span class="err">&#39;</span><span class="n">price</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">status</span><span class="err">&#39;</span><span class="p">,</span> <span class="p">...]</span> +</pre></div> + + +<h4 id="_29">我的效果图<a class="headerlink" href="#_29" title="Permanent link">&para;</a></h4> +<p><img alt="即时编辑" src="http://tulparblog.qiniudn.com/xadmin2%E5%8D%B3%E6%97%B6%E7%BC%96%E8%BE%91.png" /></p> +<h3 id="8">8.改主题的插件<a class="headerlink" href="#8" title="Permanent link">&para;</a></h3> +<p>在<code>adminx.py</code>中加入下面代码: </p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">xadmin</span> <span class="n">import</span> <span class="n">views</span> +<span class="n">class</span> <span class="n">BaseSetting</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">enable_themes</span> <span class="o">=</span> <span class="n">True</span> + <span class="n">use_bootswatch</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">xadmin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">views</span><span class="p">.</span><span class="n">BaseAdminView</span><span class="p">,</span><span class="n">BaseSetting</span><span class="p">)</span> +</pre></div>郁闷的发现一个双胞胎师兄2014-06-13T00:00:00+08:00Wontag:wbowam.github.io,2014-06-13:yu-men-de-fa-xian-yi-ge-shuang-bao-tai-shi-xiong.html<p>今天google markdown,进了一个博客。<br /> +奇迹出现了。 +<a href="http://sargeraswang.github.io/">程序员小刚</a> +小刚前辈用的博客主题跟我的一模一样,也是用多说评论系统,出奇的相似。<br /> +可见这个主题的确很好看,(<em>^__^</em>) 嘻嘻…… <br /> +大概逛了一下,小刚前辈也是做IT的,(<em>^__^</em>) 嘻嘻…… </p>把时间当作朋友读后感(1)2014-06-12T00:00:00+08:00Wontag:wbowam.github.io,2014-06-12:ba-shi-jian-dang-zuo-peng-you-du-hou-gan-1.html<p>读书最大的快乐莫过于共鸣。</p> +<hr /> +<h3 id="_1">我们都生活在同一个世界里,可都在自己的版本里。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>改变自己意味着,属于自己的版本的世界随着改变。当你的能力够大,你也能改变他人的版本,或多或少取决于你的影响力。——带来了以下问题</p> +<hr /> +<p>以上的版本这个概念来自李笑来的《把时间当作朋友》,<strong>感觉措辞不够合理</strong>。我们作为程序员,用过版本号,深有体会。就像那句名言(不记得原话怎么说的):如果你觉得写的软件不够好,那就称它为1.0版本吧。每一个版本号互相之间是独立的,没有交集的。如果1.0版本出了问题,2.0版本可以是照样跑;如果3.0版本崩了,10.0版本可以是好好的</p> +<h5 id="60102030405060702014612it10iphone">世界:假设世界上有60亿人,每个人的世界都有一个版本号,我的是1.0,牛顿的是2.0,你的是3.0,罗斯福的是4.0,爱因斯坦的是5.0,乔布斯的是6.0,他的是7.0.............版本号意味着我们的世界都是独立的。很显然,我活着(2014年6月12号),但我不应该在这里看着《把时间当作朋友》,上着网,而应该坐在椅子上想着:这个苹果为什么会掉在我的头上呢?很显然牛顿影响了我的世界,他的版本影响到我的版本了,在IT世界里,我会说:凭什么?我是1.0啊!...........而你不应该对着Iphone咪咪笑,罗斯福不应该对日本人这么残忍。。。。。。。。。。。<a class="headerlink" href="#60102030405060702014612it10iphone" title="Permanent link">&para;</a></h5> +<p>@李笑来 </p> +<h4 id="_2">很显然,假设不成立,措辞不够合理。<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4>把时间当作朋友读后感(2)2014-06-12T00:00:00+08:00Wontag:wbowam.github.io,2014-06-12:ba-shi-jian-dang-zuo-peng-you-du-hou-gan-2.html<h3 id="_1">用正确方式做正确的事情,时间无需管理。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<h3 id="_2">管理焦点不应该是时间,而是自己。<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<h4 id="_3">时间只是个工具,它用于把我们的生命划分成无数个块。<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4> +<p>生命就像一条高速公路,我们就像一辆不到终点不会停车的长途汽车,有时候看着路边的风景,有时候闭着眼睛养神,但无论何时我们一直在走。路标会告诉我们自己走在哪一路段,会走向哪里。而这路标就是时间</p>部署Socket.io 的demo2014-06-11T00:00:00+08:00Wontag:wbowam.github.io,2014-06-11:bu-shu-socketio-de-demo.html<h1 id="1nvm">1.安装nvm<a class="headerlink" href="#1nvm" title="Permanent link">&para;</a></h1> +<div class="highlight"><pre><span class="err">$</span> <span class="n">wget</span> <span class="o">-</span><span class="n">qO</span><span class="o">-</span> <span class="n">https</span><span class="o">:</span><span class="c1">//raw.github.com/creationix/nvm/v0.4.0/install.sh | sh</span> +</pre></div> + + +<h1 id="2node">2.安装node<a class="headerlink" href="#2node" title="Permanent link">&para;</a></h1> +<div class="highlight"><pre><span class="n">nvm</span> <span class="n">install</span> <span class="mf">0.1</span> +</pre></div> + + +<h6 id="usrsbinsrc">若过程中如果报错,说:创建目录/usr/sbin/src 权限不够<a class="headerlink" href="#usrsbinsrc" title="Permanent link">&para;</a></h6> +<p>我用了个极端的方法来解决此问题,不推荐</p> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">chmod</span> <span class="mi">777</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span> +</pre></div> + + +<h1 id="3">3. 跑起<a class="headerlink" href="#3" title="Permanent link">&para;</a></h1> +<div class="highlight"><pre><span class="n">cd</span> <span class="n">socket</span><span class="p">.</span><span class="n">io</span><span class="o">/</span><span class="n">example</span><span class="o">/</span><span class="n">chat</span><span class="o">/</span> +<span class="n">node</span> <span class="n">index</span><span class="p">.</span><span class="n">js</span> +</pre></div> + + +<h6 id="moudle">日如果报错误说,缺某某moudle,就一个个安装那些插件即可,如:<a class="headerlink" href="#moudle" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="n">npm</span> <span class="n">install</span> <span class="o">-</span><span class="n">g</span> <span class="n">express</span> +</pre></div>Django Dir 配置(方法一)2014-05-14T00:00:00+08:00Wontag:wbowam.github.io,2014-05-14:django-dir-pei-zhi-fang-fa-yi.html<h5 id="env">Env:<a class="headerlink" href="#env" title="Permanent link">&para;</a></h5> +<ul> +<li>django==1.4.5</li> +<li>python==2.7</li> +<li>ubuntu==13.04</li> +</ul> +<hr /> +<h3 id="_1">公用部分<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>settings.py</p> +<div class="highlight"><pre><span class="cp">##added by Tulpar,20140514</span> +<span class="n">import</span> <span class="n">os</span> +<span class="n">settings_dir</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">)</span> +<span class="n">PROJECT_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">settings_dir</span><span class="p">))</span> +</pre></div> + + +<h3 id="media">MEDIA<a class="headerlink" href="#media" title="Permanent link">&para;</a></h3> +<p>settings.py</p> +<div class="highlight"><pre><span class="n">MEDIA_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">MEDIA_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span> +</pre></div> + + +<p>urls.py</p> +<div class="highlight"><pre><span class="err">#</span><span class="vi">#added</span> <span class="k">by</span> <span class="nx">Tulpar</span><span class="p">,</span><span class="mi">20140514</span> +<span class="nb">from</span> <span class="nx">django.conf</span> <span class="k">import</span> <span class="nx">settings</span> + +<span class="nx">urlpatterns</span> <span class="o">+=</span> <span class="nx">patterns</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> + <span class="nb">url</span><span class="p">(</span><span class="nb">r</span><span class="s2">&quot;^media/(?P&lt;path&gt;.*)$&quot;</span><span class="p">,</span><span class="s2">&quot;django.views.static.serve&quot;</span><span class="p">,{</span><span class="s2">&quot;document_root&quot;</span><span class="p">:</span> <span class="nx">settings.MEDIA_ROOT</span><span class="p">,}),</span> +<span class="p">)</span> +</pre></div> + + +<h3 id="static">STATIC<a class="headerlink" href="#static" title="Permanent link">&para;</a></h3> +<p>Settings.py</p> +<div class="highlight"><pre><span class="n">STATIC_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="k">static</span><span class="o">/</span><span class="err">&#39;</span><span class="p">)</span> + +<span class="n">STATIC_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="k">static</span><span class="o">/</span><span class="err">&#39;</span> + +<span class="n">STATICFILES_DIRS</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">#</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="k">static</span><span class="o">/</span><span class="err">&#39;</span><span class="p">),</span> + <span class="p">)</span> +</pre></div> + + +<p>url.py</p> +<div class="highlight"><pre><span class="nb">from</span> <span class="nx">django.conf</span> <span class="k">import</span> <span class="nx">settings</span> +<span class="nx">urlpatterns</span> <span class="o">+=</span> <span class="nx">patterns</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> + <span class="nb">url</span><span class="p">(</span><span class="nb">r</span><span class="s2">&quot;^static/(?P&lt;path&gt;.*)$&quot;</span><span class="p">,</span><span class="s2">&quot;django.views.static.serve&quot;</span><span class="p">,{</span><span class="s2">&quot;document_root&quot;</span><span class="p">:</span> <span class="nx">settings.STATIC_ROOT</span><span class="p">,}),</span> + <span class="p">)</span> +</pre></div> + + +<h3 id="template">TEMPLATE<a class="headerlink" href="#template" title="Permanent link">&para;</a></h3> +<p>settings.py </p> +<div class="highlight"><pre><span class="n">TEMPLATE_DIRS</span> <span class="o">=</span> <span class="p">(</span> + <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">templates</span><span class="o">/</span><span class="err">&#39;</span><span class="p">),</span> +<span class="p">)</span> +</pre></div>PEP8 总结2014-05-14T00:00:00+08:00Wontag:wbowam.github.io,2014-05-14:pep8-zong-jie.html<p>pep8除了是一个标准,也是一个软件包的名字。 <br /> +提供一个pep8检测器。<br /> +运行很简单:pep8 INPUT_FILES ...<br /> +查看帮助:pep8 --help </p> +<p>一般来说,如果要检查代码,pylint和pep8最好都运行一下。pep8只能检测格式,pylint不仅检测格式,还检测语意。 </p> +<p>下文参考总结bobo的日记,感谢前辈分享~~~</p> +<hr /> +<h2 id="_1">一 代码编排<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2> +<p>1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。python3 已经不允许空格和Tab混用了。 <br /> +2 每行最大长度79,换行可以使用反斜杠。换行点要在操作符的后边敲回车。 </p> +<div class="highlight"><pre><span class="n">with</span> <span class="n">open</span><span class="p">(</span><span class="err">&#39;</span><span class="o">/</span><span class="n">path</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">some</span><span class="o">/</span><span class="n">file</span><span class="o">/</span><span class="n">you</span><span class="o">/</span><span class="n">want</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">read</span><span class="err">&#39;</span><span class="p">)</span> <span class="n">as</span> <span class="n">file_1</span><span class="p">,</span> \ + <span class="n">open</span><span class="p">(</span><span class="err">&#39;</span><span class="o">/</span><span class="n">path</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">some</span><span class="o">/</span><span class="n">file</span><span class="o">/</span><span class="n">being</span><span class="o">/</span><span class="n">written</span><span class="err">&#39;</span><span class="p">,</span> <span class="sc">&#39;w&#39;</span><span class="p">)</span> <span class="n">as</span> <span class="n">file_2</span><span class="o">:</span> + <span class="n">file_2</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">file_1</span><span class="p">.</span><span class="n">read</span><span class="p">())</span> +</pre></div> + + +<p>3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。<br /> +4 和括号开始的部分对齐: </p> +<div class="highlight"><pre><span class="nx">foo</span> <span class="o">=</span> <span class="nx">long_function_name</span><span class="p">(</span><span class="nx">var_one</span><span class="p">,</span> <span class="nx">var_two</span><span class="p">,</span> + <span class="nx">var_three</span><span class="p">,</span> <span class="nx">var_four</span><span class="p">)</span> + +<span class="err">#需要更多一层的缩进</span> +<span class="nx">def</span> <span class="nx">long_function_name</span><span class="p">(</span> + <span class="nx">var_one</span><span class="p">,</span> <span class="nx">var_two</span><span class="p">,</span> <span class="nx">var_three</span><span class="p">,</span> + <span class="nx">var_four</span><span class="p">)</span><span class="o">:</span> + <span class="nx">print</span><span class="p">(</span><span class="nx">var_one</span><span class="p">)</span> +<span class="err">##</span> <span class="err">千万不能与下一个代码行对齐。。。。</span> +</pre></div> + + +<p>5 在闭合的括号中不要加空格</p> +<div class="highlight"><pre><span class="nx">my_list</span> <span class="o">=</span> <span class="cp">[</span> + <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> + <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> +<span class="cp">]</span> +<span class="nx">result</span> <span class="o">=</span> <span class="nx">some_function_that_takes_arguments</span><span class="p">(</span> + <span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span><span class="p">,</span> <span class="s1">&#39;c&#39;</span><span class="p">,</span> + <span class="s1">&#39;d&#39;</span><span class="p">,</span> <span class="s1">&#39;e&#39;</span><span class="p">,</span> <span class="s1">&#39;f&#39;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<h3 id="_2">二 文档编排<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p>1 模块内容的顺序:模块说明和docstring—import—globals&amp;constants(静态或全局变量)—其他定义。 <br /> + 使用绝对路径import,不用import * ,可能会导入到名字相同的冲突的包 <br /> + 包含顺序也有讲究,顺序如下(他们之间最好加一个换行): + * 标准库 + * 第三方库 + * 本地的应用或者库 <br /> +2 不要在一句import中多个库,比如import os, sys不推荐。 <br /> +3 如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。 </p> +<h3 id="_3">三 空格的使用<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre> <span class="err">总体原则,避免不必要的空格。</span> +</pre></div> + + +<p>1 各种右括号前不要加空格。<br /> +2 逗号、冒号、分号前不要加空格。 </p> +<div class="highlight"><pre><span class="n">Yes</span><span class="o">:</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">4</span><span class="o">:</span> <span class="n">print</span> <span class="n">x</span><span class="o">,</span> <span class="n">y</span><span class="o">;</span> <span class="n">x</span><span class="o">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span><span class="o">,</span> <span class="n">x</span> +<span class="n">No</span><span class="o">:</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">4</span> <span class="o">:</span> <span class="n">print</span> <span class="n">x</span> <span class="o">,</span> <span class="n">y</span> <span class="o">;</span> <span class="n">x</span> <span class="o">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="o">,</span> <span class="n">x</span> +</pre></div> + + +<p>3 函数的左括号前不要加空格。如Func(1)。序列的左括号前不要加空格。如list[2]。 <br /> +4 不要为了对齐增加空格。 <br /> +5 <strong>操作符左右各加一个空格.</strong> <br /> +6 缺省值等号两边无空格: </p> +<div class="highlight"><pre><span class="n">def</span> <span class="n">connect</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">None</span><span class="p">)</span><span class="o">:</span> + <span class="n">self</span><span class="p">.</span><span class="n">_user</span> <span class="o">=</span> <span class="n">user</span> +</pre></div> + + +<p>7 不要将多句语句写在同一行,尽管使用‘;’允许。<br /> +8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。 </p> +<h3 id="_4">四 注释<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre> <span class="err">总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!</span> + <span class="err">注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。</span> + <span class="err">如果是短语,可以省略结束符。</span> +</pre></div> + + +<p>1 块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。比如: </p> +<div class="highlight"><pre><span class="c"># Description : Module config.</span> +<span class="c"># </span> +<span class="c"># Input : None</span> +<span class="c">#</span> +<span class="c"># Output : None</span> +</pre></div> + + +<p>2 行注释,在一句代码后加注释。比如:x = x + 1 # Increment x<br /> +但是这种方式尽量少使用。<br /> +3 避免无谓的注释。 </p> +<h3 id="_5">五 命名规范<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3> +<p>1 常量 : 大写加下划线 </p> +<div class="highlight"><pre><span class="n">STATUS</span> <span class="o">=</span> <span class="p">{</span> + <span class="mi">0</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;正常&#39;</span><span class="p">,</span> + <span class="mi">1</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;草稿&#39;</span><span class="p">,</span> + <span class="mi">2</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;删除&#39;</span><span class="p">,</span> +<span class="p">}</span> + +<span class="cp"># 加下划线</span> +<span class="n">POST_STATUS</span> <span class="o">=</span> <span class="p">{</span> + <span class="mi">0</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;正常&#39;</span><span class="p">,</span> + <span class="mi">1</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;草稿&#39;</span><span class="p">,</span> + <span class="mi">2</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;删除&#39;</span><span class="p">,</span> +<span class="p">}</span> +</pre></div> + + +<p>2 类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写。类名应该简明,精确. </p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">UserProfile</span><span class="p">(</span><span class="n">BaseProfile</span><span class="p">)</span><span class="o">:</span> + <span class="n">def</span> <span class="n">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">profile</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">_profile</span> <span class="o">=</span> <span class="n">profile</span> + + <span class="n">def</span> <span class="n">profile</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">_profile</span> +</pre></div> + + +<p>3 模块和包.除特殊模块 <strong>init</strong> 之外,模块名称都使用不带下划线的小写字母。<br /> +若是它们实现一个协议,那么通常使用lib为后缀,例如: </p> +<div class="highlight"><pre><span class="n">import</span> <span class="n">smtplib</span> +<span class="n">import</span> <span class="n">os</span> +<span class="n">import</span> <span class="n">sys</span> +</pre></div> + + +<h5 id="_6">分行包含:<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">Yes</span><span class="o">:</span> <span class="k">import</span> <span class="nn">os</span> + <span class="k">import</span> <span class="nn">sys</span> + +<span class="n">No</span><span class="o">:</span> <span class="k">import</span> <span class="nn">sys</span><span class="o">,</span> <span class="n">os</span> +</pre></div> + + +<h5 id="_7">下面的也可以:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">subprocess</span> <span class="n">import</span> <span class="n">Popen</span><span class="p">,</span> <span class="n">PIPE</span> +</pre></div> + + +<p>4 使用 has 或 is 前缀命名布尔元素 </p> +<div class="highlight"><pre><span class="n">is_connect</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">has_member</span> <span class="o">=</span> <span class="n">False</span> +</pre></div> + + +<p>5 用复数形式命名序列 </p> +<div class="highlight"><pre><span class="n">members</span> <span class="o">=</span> <span class="p">[</span><span class="err">&#39;</span><span class="n">user_1</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">user_2</span><span class="err">&#39;</span><span class="p">]</span> +</pre></div> + + +<p>6 避免通用名称,避免现有名称 <br /> +诸如 list, dict, sequence 或者 element 这样的名称应该避免<br /> +诸如 os, sys 这种系统已经存在的名称应该避免。 </p> +<p>7 异常名:加入后缀Error<br /> +8 函数名:小写+下划线<br /> +9 函数和方法的参数:实例使用self 开始,类使用cls 开始。如果和系统参数名重复,在其后加_ </p> +<h3 id="_8">六 验证脚本<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h3> +<p>可以安装一个 pep8 脚本用于验证你的代码风格是否符合 PEP8。</p> +<div class="highlight"><pre><span class="n">pip</span> <span class="n">install</span> <span class="n">pep8</span> +<span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">upgrade</span> <span class="n">pep8</span> +<span class="n">pip</span> <span class="n">uninstall</span> <span class="n">pep8</span> +</pre></div> + + +<p>Example usage and output</p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">pep8</span> <span class="o">--</span><span class="n">first</span> <span class="n">optparse</span><span class="p">.</span><span class="n">py</span> +<span class="cp"># 也可以传一个文件夹,pep8 --first apps/ </span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">69</span><span class="o">:</span><span class="mi">11</span><span class="o">:</span> <span class="n">E401</span> <span class="n">multiple</span> <span class="n">imports</span> <span class="n">on</span> <span class="n">one</span> <span class="n">line</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">77</span><span class="o">:</span><span class="mi">1</span><span class="o">:</span> <span class="n">E302</span> <span class="n">expected</span> <span class="mi">2</span> <span class="n">blank</span> <span class="n">lines</span><span class="p">,</span> <span class="n">found</span> <span class="mi">1</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">88</span><span class="o">:</span><span class="mi">5</span><span class="o">:</span> <span class="n">E301</span> <span class="n">expected</span> <span class="mi">1</span> <span class="n">blank</span> <span class="n">line</span><span class="p">,</span> <span class="n">found</span> <span class="mi">0</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">222</span><span class="o">:</span><span class="mi">34</span><span class="o">:</span> <span class="n">W602</span> <span class="n">deprecated</span> <span class="n">form</span> <span class="n">of</span> <span class="n">raising</span> <span class="n">exception</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">347</span><span class="o">:</span><span class="mi">31</span><span class="o">:</span> <span class="n">E211</span> <span class="n">whitespace</span> <span class="n">before</span> <span class="sc">&#39;(&#39;</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">357</span><span class="o">:</span><span class="mi">17</span><span class="o">:</span> <span class="n">E201</span> <span class="n">whitespace</span> <span class="n">after</span> <span class="sc">&#39;{&#39;</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">472</span><span class="o">:</span><span class="mi">29</span><span class="o">:</span> <span class="n">E221</span> <span class="n">multiple</span> <span class="n">spaces</span> <span class="n">before</span> <span class="n">operator</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">544</span><span class="o">:</span><span class="mi">21</span><span class="o">:</span> <span class="n">W601</span> <span class="p">.</span><span class="n">has_key</span><span class="p">()</span> <span class="n">is</span> <span class="n">deprecated</span><span class="p">,</span> <span class="n">use</span> <span class="err">&#39;</span><span class="n">in</span><span class="err">&#39;</span> +</pre></div> + + +<p>You can also make pep8.py show the source code for each error, and even the relevant text from PEP 8: </p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">pep8</span> <span class="o">--</span><span class="n">show</span><span class="o">-</span><span class="n">source</span> <span class="o">--</span><span class="n">show</span><span class="o">-</span><span class="n">pep8</span> <span class="n">testsuite</span><span class="o">/</span><span class="n">E40</span><span class="p">.</span><span class="n">py</span> +<span class="n">testsuite</span><span class="o">/</span><span class="n">E40</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">2</span><span class="o">:</span><span class="mi">10</span><span class="o">:</span> <span class="n">E401</span> <span class="n">multiple</span> <span class="n">imports</span> <span class="n">on</span> <span class="n">one</span> <span class="n">line</span> +<span class="n">import</span> <span class="n">os</span><span class="p">,</span> <span class="n">sys</span> + <span class="o">^</span> + <span class="n">Imports</span> <span class="n">should</span> <span class="n">usually</span> <span class="n">be</span> <span class="n">on</span> <span class="n">separate</span> <span class="n">lines</span><span class="p">.</span> + + <span class="nl">Okay:</span> <span class="n">import</span> <span class="n">os</span><span class="err">\</span><span class="n">nimport</span> <span class="n">sys</span> + <span class="nl">E401:</span> <span class="n">import</span> <span class="n">sys</span><span class="p">,</span> <span class="n">os</span> +</pre></div> + + +<h6 id="sublime2autopep8">你也可以装上sublime2插件<code>AutoPEP8</code>,右键即可规范代码<a class="headerlink" href="#sublime2autopep8" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="nl">AutoPEP8:</span> +<span class="o">--------</span> + + <span class="n">Sublime</span> <span class="n">Auto</span> <span class="n">PEP8</span> <span class="n">Formatting</span> + <span class="p">(</span><span class="n">https</span><span class="o">:</span><span class="c1">//github.com/wistful/SublimeAutoPEP8)</span> + + <span class="n">Automatically</span> <span class="n">formats</span> <span class="n">Python</span> <span class="n">code</span> <span class="n">to</span> <span class="n">conform</span> <span class="n">to</span> <span class="n">the</span> <span class="n">PEP</span> <span class="mi">8</span> <span class="n">style</span> <span class="n">guide</span> <span class="n">using</span> <span class="n">autopep8</span> <span class="n">module</span> + <span class="n">Support</span> <span class="n">ST2</span> <span class="n">and</span> <span class="n">ST3</span> + + <span class="nl">Features:</span> + <span class="n">format</span> <span class="o">/</span> <span class="n">preview</span> <span class="n">code</span> <span class="n">according</span> <span class="n">PEP8</span> + <span class="n">format</span> <span class="o">/</span> <span class="n">preview</span> <span class="n">selected</span> <span class="n">text</span> + <span class="n">format</span> <span class="o">/</span> <span class="n">preview</span> <span class="n">all</span> <span class="n">python</span> <span class="n">modules</span> <span class="n">in</span> <span class="n">folder</span> + <span class="n">side</span> <span class="n">bar</span> <span class="n">menu</span> + <span class="n">formated</span> <span class="n">code</span> <span class="k">while</span> <span class="n">saving</span> + + <span class="nl">Using:</span> + <span class="n">SideBar</span> <span class="o">-</span> <span class="n">right</span> <span class="n">click</span> <span class="n">on</span> <span class="n">the</span> <span class="n">file</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="n">or</span> <span class="n">folder</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> + <span class="n">Active</span> <span class="n">view</span> <span class="o">-</span> <span class="n">right</span> <span class="n">click</span> <span class="n">on</span> <span class="n">the</span> <span class="n">view</span> + <span class="n">Selected</span> <span class="n">text</span> <span class="o">-</span> <span class="n">right</span> <span class="n">click</span> <span class="n">on</span> <span class="n">the</span> <span class="n">selected</span> <span class="n">text</span> + <span class="n">On</span> <span class="n">Save</span> <span class="o">-</span> <span class="n">provide</span> <span class="n">by</span> <span class="n">settings</span><span class="o">:</span> <span class="n">option</span> <span class="n">format_on_save</span> + <span class="n">Command</span> <span class="n">Palette</span> <span class="o">-</span> <span class="n">bring</span> <span class="n">up</span> <span class="n">the</span> <span class="n">Command</span> <span class="n">Palette</span> <span class="n">and</span> <span class="n">select</span> <span class="err">`</span><span class="n">PEP8</span><span class="o">:</span> <span class="n">Format</span> <span class="n">Code</span><span class="err">`</span> <span class="n">or</span> <span class="err">`</span><span class="n">PEP8</span><span class="o">:</span> <span class="n">Preview</span> <span class="n">Changes</span><span class="err">`</span> + <span class="n">Hotkeys</span> <span class="o">-</span> <span class="err">`</span><span class="n">Command</span><span class="o">/</span><span class="n">Control</span> <span class="o">+</span> <span class="n">Shift</span> <span class="o">+</span> <span class="mi">8</span><span class="err">`</span> <span class="n">to</span> <span class="n">format</span> <span class="n">code</span><span class="p">,</span> <span class="err">`</span><span class="n">Command</span><span class="o">/</span><span class="n">Control</span> <span class="o">+</span> <span class="mi">8</span><span class="err">`</span> <span class="n">to</span> <span class="n">preview</span> <span class="n">changes</span> +</pre></div> + + +<h3 id="_9">七 源码文件的编码<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h3> +<p>python2 默认ASCII ,python3 默认utf8 <br /> +都用utf8省事 </p>用Django mptt后台中生成树状数据结构2014-04-16T00:00:00+08:00Wontag:wbowam.github.io,2014-04-16:yong-django-mptthou-tai-zhong-sheng-cheng-shu-zhuang-shu-ju-jie-gou.html<h3 id="_1">背景说明:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>昨天跟客户谈需求时,客户要求做一个数状数据结构,类似于:<br /> +<img alt="树状数据" src="http://tulparblog.qiniudn.com/mpttsitepoint_tree.jpg" /></p> +<h5 id="_2">不仅要在前台这么显示,后台也要这么显示。<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h5> +<p>一番google之后 ,感谢Stack Overflow让我找到了Django mptt,感谢<a href="http://qinxuye.me/article/introduction-and-usage-of-django-mptt/">残阳似血</a>血写了如此华丽的博客,小生很喜欢添加趣点功能</p> +<hr /> +<h3 id="_3">解决方案<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<h5 id="django-mptt">用django mptt改变数据结构<a class="headerlink" href="#django-mptt" title="Permanent link">&para;</a></h5> +<h5 id="django-mptt-admindjango">用django-mptt-admin改变数状结构在django后台的显示方式<a class="headerlink" href="#django-mptt-admindjango" title="Permanent link">&para;</a></h5> +<h3 id="_4">具体操作<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<h4 id="1-django-mptt">1. 安装django mptt<a class="headerlink" href="#1-django-mptt" title="Permanent link">&para;</a></h4> +<p>下载源码 <code>https://github.com/django-mptt/django-mptt</code> +<em>或</em> +<code>pip install django-mptt</code></p> +<h4 id="2-django-mptt">2. 配置django mptt<a class="headerlink" href="#2-django-mptt" title="Permanent link">&para;</a></h4> +<p>在settings文件下的INSTALLED_APPS中添加'mptt'<br /> +<em>就这么简单,安装配置结束了</em></p> +<h4 id="3-django-mptt">3. 使用django mptt<a class="headerlink" href="#3-django-mptt" title="Permanent link">&para;</a></h4> +<h5 id="modelmpttmodel">写model,继承MPTTModel<a class="headerlink" href="#modelmpttmodel" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">mptt</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">MPTTModel</span> +<span class="n">class</span> <span class="n">MPTTFood</span><span class="p">(</span><span class="n">MPTTModel</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">50</span><span class="p">)</span> + <span class="n">parent</span> <span class="o">=</span> <span class="n">TreeForeignKey</span><span class="p">(</span><span class="s">&quot;self&quot;</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="n">True</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s">&quot;children&quot;</span><span class="p">)</span> + + <span class="n">def</span> <span class="n">__unicode__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">title</span> +</pre></div> + + +<h6 id="parentmptt">注:理论上,不一定用“parent“去跟字段的名字,MPTT元类中指明即可,如<a class="headerlink" href="#parentmptt" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="n">from</span> <span class="n">mptt</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">MPTTModel</span> + +<span class="n">class</span> <span class="n">MPTTFood</span><span class="p">(</span><span class="n">MPTTModel</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">50</span><span class="p">)</span> + <span class="n">parent_food</span> <span class="o">=</span> <span class="n">TreeForeignKey</span><span class="p">(</span><span class="s">&quot;self&quot;</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="n">True</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s">&quot;children&quot;</span><span class="p">)</span> + + <span class="n">class</span> <span class="n">MPTTMeta</span><span class="o">:</span> + <span class="n">parent_attr</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">parent_food</span><span class="err">&#39;</span> + + <span class="n">def</span> <span class="n">__unicode__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">title</span> +</pre></div> + + +<h6 id="parent">但强烈建议,如果能用就用“parent”<a class="headerlink" href="#parent" title="Permanent link">&para;</a></h6> +<h5 id="adminpy">写admin.py,注册<a class="headerlink" href="#adminpy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span> <span class="n">import</span> <span class="n">admin</span> +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">MPTTFood</span> + + +<span class="n">class</span> <span class="n">MPTTFoodAdmin</span><span class="p">(</span><span class="n">admin</span><span class="p">.</span><span class="n">ModelAdmin</span><span class="p">)</span><span class="o">:</span> + <span class="n">tree_auto_open</span> <span class="o">=</span> <span class="mi">0</span> + <span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,)</span> + <span class="n">ordering</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,)</span> + + + +<span class="n">admin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">MPTTFood</span><span class="p">,</span><span class="n">MPTTFoodAdmin</span><span class="p">)</span> +</pre></div> + + +<p><em>有关mptt已经结束,关于在前台怎么用数状数据,请看官方文档</em></p> +<h4 id="4-django-mptt-admin">4. 安装django-mptt-admin<a class="headerlink" href="#4-django-mptt-admin" title="Permanent link">&para;</a></h4> +<p><code>pip install django_mptt_admin</code> +或 <br /> +下载源码<code>https://github.com/leukeleu/django-mptt-admin</code></p> +<h4 id="5-django-mptt-admin">5.配置 django-mptt-admin<a class="headerlink" href="#5-django-mptt-admin" title="Permanent link">&para;</a></h4> +<p>Add django_mptt_admin to your installed apps in settings.py</p> +<h5 id="6-django-mptt-admin">6.使用 django-mptt-admin<a class="headerlink" href="#6-django-mptt-admin" title="Permanent link">&para;</a></h5> +<p>只要在admin.py里继承DjangoMpttAdmin即可</p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span> <span class="n">import</span> <span class="n">admin</span> +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">MPTTFood</span> +<span class="n">from</span> <span class="n">django_mptt_admin</span><span class="p">.</span><span class="n">admin</span> <span class="n">import</span> <span class="n">DjangoMpttAdmin</span> + + +<span class="n">class</span> <span class="n">MPTTFoodAdmin</span><span class="p">(</span><span class="n">DjangoMpttAdmin</span><span class="p">)</span><span class="o">:</span> + <span class="n">tree_auto_open</span> <span class="o">=</span> <span class="mi">0</span> + <span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,)</span> + <span class="n">ordering</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,)</span> + +<span class="n">admin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">MPTTFood</span><span class="p">,</span><span class="n">MPTTFoodAdmin</span><span class="p">)</span> +</pre></div> + + +<hr /> +<p>That's All</p>Edx_errors2014-04-14T00:00:00+08:00Wontag:wbowam.github.io,2014-04-14:edx_errors.html<h3 id="1-vagrantvirtualboxubuntuedxpaltform">1. 用Vagrant+Virtualbox+Ubuntu搭好Edx—paltform,执行启动命令:<a class="headerlink" href="#1-vagrantvirtualboxubuntuedxpaltform" title="Permanent link">&para;</a></h3> +<p><code>vagrant up</code></p> +<h4 id="_1">错误:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="s">&quot;The guest machine entered an invalid state while waiting for it to boot. </span> +<span class="n">Valid</span> <span class="n">states</span> <span class="n">are</span> <span class="err">&#39;</span><span class="n">starting</span><span class="p">,</span> <span class="n">running</span><span class="err">&#39;</span><span class="p">.</span> <span class="n">The</span> <span class="n">machine</span> <span class="n">is</span> <span class="n">in</span> <span class="n">the</span> <span class="err">&#39;</span><span class="n">poweroff</span><span class="err">&#39;</span> <span class="n">state</span><span class="p">.</span> + <span class="n">Please</span> <span class="n">verify</span> <span class="n">everything</span> <span class="n">is</span> <span class="n">configured</span> <span class="n">properly</span> <span class="n">and</span> <span class="n">try</span> <span class="n">again</span><span class="p">.</span><span class="s">&quot; </span> +</pre></div> + + +<h4 id="_2">原因:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p><strong>这是因为CPU不支持VT-X技术或者VT-X技术被锁定。</strong> </p> +<p>如果不打开虚拟化支持,是不能在虚拟机装<strong>64位操作系统</strong>或者安装操作系统设置<strong>多个CPU</strong>,如果安装32位操作系统只设置一个CPU,则不会出现上述错误。 </p> +<h4 id="_3">解决方案一<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4> +<p>VT-X是Intel CPU虚拟化技术,<strong>查看CPU是否支持VT-x技术:</strong> </p> +<div class="highlight"><pre><span class="n">cat</span> <span class="o">/</span><span class="n">proc</span><span class="o">/</span><span class="n">cpuinfo</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">flags</span> +</pre></div> + + +<p>如果存在 vmx 选项,则说明支持。<br /> +设置CPU开启VT-x技术。</p> +<p><strong>开机进入BIOS选项 ,依次选Config-&gt;CPU-&gt;Intel Virtualization Technology,里面有个Intel VT-d Feature ,改成Enabled ,保存退出,关机,然后启动机器。</strong></p> +<h4 id="_4">解决方案二<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h4> +<p>改虚拟机配置:<br /> +<code>vim Vagrantfile</code> +即改CPU</p> +<div class="highlight"><pre><span class="n">CPU_COUNT</span> <span class="o">=</span> <span class="mi">1</span> +</pre></div> + + +<hr /> +<hr /> +<h3 id="2vagrantvirtualboxubuntuedxpaltformvagrant-ssh">2.用Vagrant+Virtualbox+Ubuntu搭好Edx—paltform,执行启动命令:<code>vagrant ssh</code><a class="headerlink" href="#2vagrantvirtualboxubuntuedxpaltformvagrant-ssh" title="Permanent link">&para;</a></h3> +<h4 id="_5">错误:<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4> +<p><code>ssh_exchange_identification: Connection closed by remote host</code></p> +<h4 id="_6">原因:<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h4> +<p>典型的tcp_wrapper配置了不允许你这个ip登录ssh</p> +<h4 id="_7">解决方案:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h4> +<p><strong>让/etc/hosts.allow 和/etc/hosts.deny里面的所有信息都不生效,全部注销掉,重启SSH服务</strong></p> +<p><a href="http://www.zhihu.com/question/20023544">参考</a></p> +<h3 id="3-edx-platformvagrant-up">3. 阿里云上部署好Edx-platform后,vagrant up 报了一些错<a class="headerlink" href="#3-edx-platformvagrant-up" title="Permanent link">&para;</a></h3> +<h4 id="_8">第一个错误:语法错误<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h4> +<h5 id="vagrant-101">原因:vagrant 版本过低(因为阿里云的源只有1.0.1版)<a class="headerlink" href="#vagrant-101" title="Permanent link">&para;</a></h5> +<h5 id="_9">解决方案:<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h5> +<p>Go to the downloads page of Vagrant and check for the latest release. Once you are looking at the different versions of the latest release, right click over the one with the .deb extension and copy the link address. Then head back to your terminal and run the following command:</p> +<div class="highlight"><pre><span class="n">wget</span> <span class="n">http</span><span class="o">:</span><span class="c1">//files.vagrantup.com/packages/0219bb87725aac28a97c0e924c310cc97831fd9d/vagrant_1.2.4_i686.deb</span> +</pre></div> + + +<p>Replace the URL you see above (following the wget command) with the one you just copied. This will download Vagrant to your system. Next, install the package with the following command:</p> +<div class="highlight"><pre><span class="n">dpkg</span> <span class="o">-</span><span class="n">i</span> <span class="n">vagrant_1</span><span class="mf">.2.4</span><span class="n">_i686</span><span class="p">.</span><span class="n">deb</span> +</pre></div> + + +<div class="highlight"><pre><span class="n">VirtualBox</span> <span class="n">is</span> <span class="n">complaining</span> <span class="n">that</span> <span class="n">the</span> <span class="n">installation</span> <span class="n">is</span> <span class="n">incomplete</span><span class="p">.</span> <span class="n">Please</span> +<span class="n">run</span> <span class="err">`</span><span class="n">VBoxManage</span> <span class="o">--</span><span class="n">version</span><span class="err">`</span> <span class="n">to</span> <span class="n">see</span> <span class="n">the</span> <span class="n">error</span> <span class="n">message</span> <span class="n">which</span> <span class="n">should</span> <span class="n">contain</span> +<span class="n">instructions</span> <span class="n">on</span> <span class="n">how</span> <span class="n">to</span> <span class="n">fix</span> <span class="n">this</span> <span class="n">error</span><span class="p">.</span> +</pre></div> + + +<hr /> +<h6 id="_10"># <em>下面问题的解决方案,被作者怀疑,准确性有待考察,请小伙伴们慎用!</em><a class="headerlink" href="#_10" title="Permanent link">&para;</a></h6> +<hr /> +<h4 id="_11">第二个错误:<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">VirtualBox</span> <span class="n">is</span> <span class="n">complaining</span> <span class="n">that</span> <span class="n">the</span> <span class="n">installation</span> <span class="n">is</span> <span class="n">incomplete</span><span class="p">.</span> <span class="n">Please</span> +<span class="n">run</span> <span class="err">`</span><span class="n">VBoxManage</span> <span class="o">--</span><span class="n">version</span><span class="err">`</span> <span class="n">to</span> <span class="n">see</span> <span class="n">the</span> <span class="n">error</span> <span class="n">message</span> <span class="n">which</span> <span class="n">should</span> <span class="n">contain</span> +<span class="n">instructions</span> <span class="n">on</span> <span class="n">how</span> <span class="n">to</span> <span class="n">fix</span> <span class="n">this</span> <span class="n">error</span><span class="p">.</span> +</pre></div> + + +<h5 id="_12">解决方案<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">dpkg</span><span class="o">-</span><span class="n">dev</span> <span class="n">virtualbox</span><span class="o">-</span><span class="n">dkms</span> +</pre></div> + + +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">linux</span><span class="o">-</span><span class="n">headers</span><span class="o">-</span><span class="err">$</span><span class="p">(</span><span class="n">uname</span> <span class="o">-</span><span class="n">r</span><span class="p">)</span> +</pre></div> + + +<p><code>sudo dpkg-reconfigure virtualbox-dkms</code></p> +<hr /> +<h6 id="_13"># <em>上面问题的解决方案,被作者怀疑,准确性有待考察,请小伙伴们慎用!</em><a class="headerlink" href="#_13" title="Permanent link">&para;</a></h6> +<hr /> +<h3 id="4vagrant-up">4.阿里云上部署好,vagrant up<a class="headerlink" href="#4vagrant-up" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">wwj</span><span class="err">@</span><span class="n">AY14051916372845353bZ</span><span class="o">:~/</span><span class="n">fullstack</span><span class="err">$</span> <span class="n">vagrant</span> <span class="n">up</span> +<span class="n">Bringing</span> <span class="n">machine</span> <span class="err">&#39;</span><span class="k">default</span><span class="err">&#39;</span> <span class="n">up</span> <span class="n">with</span> <span class="err">&#39;</span><span class="n">virtualbox</span><span class="err">&#39;</span> <span class="n">provider</span><span class="p">...</span> +<span class="o">==&gt;</span> <span class="k">default</span><span class="o">:</span> <span class="n">Box</span> <span class="err">&#39;</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="err">&#39;</span> <span class="n">could</span> <span class="n">not</span> <span class="n">be</span> <span class="n">found</span><span class="p">.</span> <span class="n">Attempting</span> <span class="n">to</span> <span class="n">find</span> <span class="n">and</span> <span class="n">install</span><span class="p">...</span> + <span class="nl">default:</span> <span class="n">Box</span> <span class="n">Provider</span><span class="o">:</span> <span class="n">virtualbox</span> + <span class="nl">default:</span> <span class="n">Box</span> <span class="n">Version</span><span class="o">:</span> <span class="o">&gt;=</span> <span class="mi">0</span> +<span class="o">==&gt;</span> <span class="k">default</span><span class="o">:</span> <span class="n">Adding</span> <span class="n">box</span> <span class="err">&#39;</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="err">&#39;</span> <span class="p">(</span><span class="n">v0</span><span class="p">)</span> <span class="k">for</span> <span class="n">provider</span><span class="o">:</span> <span class="n">virtualbox</span> + <span class="nl">default:</span> <span class="n">Downloading</span><span class="o">:</span> <span class="n">file</span><span class="o">:</span><span class="c1">///home/wwj/fullstack/20140418-injera-fullstack.box</span> +<span class="n">The</span> <span class="n">box</span> <span class="n">failed</span> <span class="n">to</span> <span class="n">unpackage</span> <span class="n">properly</span><span class="p">.</span> <span class="n">Please</span> <span class="n">verify</span> <span class="n">that</span> <span class="n">the</span> <span class="n">box</span> +<span class="n">file</span> <span class="n">you</span><span class="err">&#39;</span><span class="n">re</span> <span class="n">trying</span> <span class="n">to</span> <span class="n">add</span> <span class="n">is</span> <span class="n">not</span> <span class="n">corrupted</span> <span class="n">and</span> <span class="n">try</span> <span class="n">again</span><span class="p">.</span> <span class="n">The</span> +<span class="n">output</span> <span class="n">from</span> <span class="n">attempting</span> <span class="n">to</span> <span class="n">unpackage</span> <span class="p">(</span><span class="k">if</span> <span class="n">any</span><span class="p">)</span><span class="o">:</span> + +<span class="nl">bsdtar:</span> <span class="n">Failed</span> <span class="n">to</span> <span class="n">set</span> <span class="k">default</span> <span class="n">locale</span> +<span class="n">x</span> <span class="p">.</span><span class="o">/</span><span class="n">Vagrantfile</span> +<span class="n">x</span> <span class="p">.</span><span class="o">/</span><span class="n">box</span><span class="o">-</span><span class="n">disk1</span><span class="p">.</span><span class="n">vmdk</span><span class="o">:</span> <span class="n">Write</span> <span class="n">failed</span> +<span class="n">x</span> <span class="p">.</span><span class="o">/</span><span class="n">box</span><span class="p">.</span><span class="n">ovf</span><span class="o">:</span> <span class="n">Write</span> <span class="n">failed</span> +<span class="nl">bsdtar:</span> <span class="n">Error</span> <span class="n">exit</span> <span class="n">delayed</span> <span class="n">from</span> <span class="n">previous</span> <span class="n">errors</span><span class="p">.</span> +</pre></div> + + +<hr /> +<h3 id="5edx-platformvagrant-up">5.阿里云上部署Edx-platform,vagrant up后,<a class="headerlink" href="#5edx-platformvagrant-up" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">An</span> <span class="n">error</span> <span class="n">occurred</span> <span class="k">while</span> <span class="n">downloading</span> <span class="n">the</span> <span class="n">remote</span> <span class="n">file</span><span class="p">.</span> <span class="n">The</span> <span class="n">error</span> +<span class="n">message</span><span class="p">,</span> <span class="k">if</span> <span class="n">any</span><span class="p">,</span> <span class="n">is</span> <span class="n">reproduced</span> <span class="n">below</span><span class="p">.</span> <span class="n">Please</span> <span class="n">fix</span> <span class="n">this</span> <span class="n">error</span> <span class="n">and</span> <span class="n">try</span> +<span class="n">again</span><span class="p">.</span> + +<span class="n">Failed</span> <span class="n">writing</span> <span class="n">body</span> <span class="p">(</span><span class="mi">488</span> <span class="o">!=</span> <span class="mi">16383</span><span class="p">)</span> +</pre></div> + + +<h5 id="20g16g">原因:磁盘空间不足,阿里云服务器系统盘只有20G,已用16G,加载虚拟机,开始展开镜像,导致磁盘空间不足<a class="headerlink" href="#20g16g" title="Permanent link">&para;</a></h5> +<h4 id="_14">解决方案:<a class="headerlink" href="#_14" title="Permanent link">&para;</a></h4> +<h5 id="130g">第一步:买了个阿里云130G的数据盘<a class="headerlink" href="#130g" title="Permanent link">&para;</a></h5> +<p>数据盘的挂载及使用,请参考<a href="http://help.aliyun.com/view/11108189_13435365.html?spm=5176.7224609.1997282825.4.ezRjvD">阿里云帮助文档——挂载数据盘</a></p> +<h5 id="vagrantvagrant_home">第二部:更改Vagrant的根目录(VAGRANT_HOME)<a class="headerlink" href="#vagrantvagrant_home" title="Permanent link">&para;</a></h5> +<p>在<code>~/.bashrc</code>中加入: </p> +<div class="highlight"><pre><span class="n">export</span> <span class="n">VAGRANT_HOME</span><span class="o">=/</span><span class="n">path</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">vagrant</span> +</pre></div> + + +<hr /> +<h3 id="6edx-platformvagrant-up">6.阿里云上部署Edx-platform,vagrant up后,<a class="headerlink" href="#6edx-platformvagrant-up" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">vagrant</span> <span class="n">up</span> +<span class="n">Bringing</span> <span class="n">machine</span> <span class="err">&#39;</span><span class="k">default</span><span class="err">&#39;</span> <span class="n">up</span> <span class="n">with</span> <span class="err">&#39;</span><span class="n">virtualbox</span><span class="err">&#39;</span> <span class="n">provider</span><span class="p">...</span> +<span class="o">==&gt;</span> <span class="k">default</span><span class="o">:</span> <span class="n">Box</span> <span class="err">&#39;</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="err">&#39;</span> <span class="n">could</span> <span class="n">not</span> <span class="n">be</span> <span class="n">found</span><span class="p">.</span> <span class="n">Attempting</span> <span class="n">to</span> <span class="n">find</span> <span class="n">and</span> <span class="n">install</span><span class="p">...</span> + <span class="nl">default:</span> <span class="n">Box</span> <span class="n">Provider</span><span class="o">:</span> <span class="n">virtualbox</span> + <span class="nl">default:</span> <span class="n">Box</span> <span class="n">Version</span><span class="o">:</span> <span class="o">&gt;=</span> <span class="mi">0</span> +<span class="o">==&gt;</span> <span class="k">default</span><span class="o">:</span> <span class="n">Adding</span> <span class="n">box</span> <span class="err">&#39;</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="err">&#39;</span> <span class="p">(</span><span class="n">v0</span><span class="p">)</span> <span class="k">for</span> <span class="n">provider</span><span class="o">:</span> <span class="n">virtualbox</span> + <span class="nl">default:</span> <span class="n">Downloading</span><span class="o">:</span> <span class="n">file</span><span class="o">:</span><span class="c1">///home/wwj/fullstack/20140418-injera-fullstack.box.1</span> +<span class="o">==&gt;</span> <span class="k">default</span><span class="o">:</span> <span class="n">Successfully</span> <span class="n">added</span> <span class="n">box</span> <span class="err">&#39;</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="err">&#39;</span> <span class="p">(</span><span class="n">v0</span><span class="p">)</span> <span class="k">for</span> <span class="err">&#39;</span><span class="n">virtualbox</span><span class="err">&#39;</span><span class="o">!</span> +<span class="n">There</span> <span class="n">are</span> <span class="n">errors</span> <span class="n">in</span> <span class="n">the</span> <span class="n">configuration</span> <span class="n">of</span> <span class="n">this</span> <span class="n">machine</span><span class="p">.</span> <span class="n">Please</span> <span class="n">fix</span> +<span class="n">the</span> <span class="n">following</span> <span class="n">errors</span> <span class="n">and</span> <span class="n">try</span> <span class="n">again</span><span class="o">:</span> + +<span class="nl">Vagrant:</span> +<span class="o">*</span> <span class="n">Unknown</span> <span class="n">configuration</span> <span class="n">section</span> <span class="err">&#39;</span><span class="n">hostsupdater</span><span class="err">&#39;</span><span class="p">.</span> +</pre></div> + + +<h4 id="_15">原因:<a class="headerlink" href="#_15" title="Permanent link">&para;</a></h4> +<p><code>vagrant plugin list</code>发现 plugin <code>hostsupdater</code>没了, <br /> +还记得问题5里,我们改了VAGRANT_HOME,但是没copy <code>~/.vagrant.d/</code>因此得重新装一下<code>hostsupdater</code>:<br /> +<code>vagrant plugin install vagrant-hostsupdater</code></p> +<h3 id="7vagrant">7.vagrant<a class="headerlink" href="#7vagrant" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">vagrant</span> <span class="o">-</span><span class="n">v</span> +<span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">vagrant</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">vagrant</span><span class="o">:</span> <span class="n">line</span> <span class="mi">64</span><span class="o">:</span> +<span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">vagrant</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="p">..</span><span class="o">/</span><span class="n">embedded</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">ruby</span><span class="o">:</span> <span class="n">No</span> <span class="n">such</span> <span class="n">file</span> <span class="n">or</span> <span class="n">directory</span> +</pre></div> + + +<h4 id="_16">原因:装错包了<a class="headerlink" href="#_16" title="Permanent link">&para;</a></h4> +<p><code>i686.deb</code>不是<code>64位的意思</code></p> +<h4 id="vagrant_x86_64debvagrant_i686deb">解决方案:装vagrant_x86_64.deb而不是vagrant_i686.deb<a class="headerlink" href="#vagrant_x86_64debvagrant_i686deb" title="Permanent link">&para;</a></h4> +<p><a href="https://github.com/mitchellh/vagrant/issues/1559">参考</a></p> +<h3 id="8">8.<a class="headerlink" href="#8" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">WARNING</span><span class="o">:</span> <span class="n">The</span> <span class="n">vboxdrv</span> <span class="n">kernel</span> <span class="n">module</span> <span class="k">is</span> <span class="n">not</span> <span class="n">loaded</span><span class="o">.</span> <span class="n">Either</span> <span class="n">there</span> <span class="k">is</span> <span class="n">no</span> <span class="n">module</span> + <span class="n">available</span> <span class="k">for</span> <span class="n">the</span> <span class="n">current</span> <span class="n">kernel</span> <span class="o">(</span><span class="mf">3.2</span><span class="o">.</span><span class="mi">0</span><span class="o">-</span><span class="mi">29</span><span class="o">-</span><span class="n">generic</span><span class="o">)</span> <span class="n">or</span> <span class="n">it</span> <span class="n">failed</span> <span class="n">to</span> + <span class="n">load</span><span class="o">.</span> <span class="n">Please</span> <span class="n">recompile</span> <span class="n">the</span> <span class="n">kernel</span> <span class="n">module</span> <span class="n">and</span> <span class="n">install</span> <span class="n">it</span> <span class="n">by</span> + + <span class="n">sudo</span> <span class="sr">/etc/init.d/</span><span class="n">vboxdrv</span> <span class="n">setup</span> + + <span class="n">You</span> <span class="n">will</span> <span class="n">not</span> <span class="n">be</span> <span class="n">able</span> <span class="n">to</span> <span class="n">start</span> <span class="n">VMs</span> <span class="n">until</span> <span class="k">this</span> <span class="n">problem</span> <span class="k">is</span> <span class="n">fixed</span><span class="o">.</span> +<span class="mf">4.3</span><span class="o">.</span><span class="mi">12</span><span class="n">r93733</span> +</pre></div> + + +<h4 id="_17">原因:<a class="headerlink" href="#_17" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">he</span> <span class="n">vboxdrv</span> <span class="n">kernel</span> <span class="n">module</span> <span class="n">is</span> <span class="n">not</span> <span class="n">loaded</span><span class="p">.</span> <span class="n">Either</span> <span class="n">there</span> <span class="n">is</span> <span class="n">no</span> <span class="n">module</span> + <span class="n">available</span> <span class="k">for</span> <span class="n">the</span> <span class="n">current</span> <span class="n">kernel</span> <span class="p">(</span><span class="mf">3.2.0</span><span class="o">-</span><span class="mi">29</span><span class="o">-</span><span class="n">generic</span><span class="p">)</span> <span class="n">or</span> <span class="n">it</span> <span class="n">failed</span> <span class="n">to</span> + <span class="n">load</span><span class="p">.</span> <span class="n">Please</span> <span class="n">recompile</span> <span class="n">the</span> <span class="n">kernel</span> <span class="n">module</span> <span class="n">and</span> <span class="n">install</span> <span class="n">it</span> <span class="n">by</span> +</pre></div> + + +<h4 id="_18">解决方案:<a class="headerlink" href="#_18" title="Permanent link">&para;</a></h4> +<p>make sure: setup vboxdrv, and it is successful</p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">sudo</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">rc</span><span class="p">.</span><span class="n">d</span><span class="o">/</span><span class="n">vboxdrv</span> <span class="n">setup</span> +<span class="o">::</span> <span class="n">Unloading</span> <span class="n">VirtualBox</span> <span class="n">kernel</span> <span class="n">modules</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +<span class="o">::</span> <span class="n">Removing</span> <span class="n">old</span> <span class="n">VirtualBox</span> <span class="n">netadp</span> <span class="n">kernel</span> <span class="n">module</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +<span class="o">::</span> <span class="n">Removing</span> <span class="n">old</span> <span class="n">VirtualBox</span> <span class="n">netflt</span> <span class="n">kernel</span> <span class="n">module</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +<span class="o">::</span> <span class="n">Removing</span> <span class="n">old</span> <span class="n">VirtualBox</span> <span class="n">kernel</span> <span class="n">module</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +<span class="o">::</span> <span class="n">Recompiling</span> <span class="n">VirtualBox</span> <span class="n">kernel</span> <span class="n">modules</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +<span class="o">::</span> <span class="n">Reloading</span> <span class="n">VirtualBox</span> <span class="n">kernel</span> <span class="n">modules</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +</pre></div> + + +<h5 id="if-the-warning-is-still-given-go-ahead-else-goodbye">If the warning is still given, go ahead! Else GoodBye!<a class="headerlink" href="#if-the-warning-is-still-given-go-ahead-else-goodbye" title="Permanent link">&para;</a></h5> +<p>you need to either manually load the module or add it in the MODULES array in rc.conf </p> +<p>to auto load the module at boot add <code>vboxdrv</code> to modules array in <code>/etc/rc.conf</code>,by the command: +<code>sudo modprobe vboxdrv</code></p>在真机上部署Edx(在中国)2014-04-08T00:00:00+08:00Wontag:wbowam.github.io,2014-04-08:zai-zhen-ji-shang-bu-shu-edxzai-zhong-guo.html<h3 id="1-update-your-ubuntu-package-sources">1. Update your Ubuntu package sources<a class="headerlink" href="#1-update-your-ubuntu-package-sources" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">update</span> <span class="o">-</span><span class="n">y</span> +<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">upgrade</span> <span class="o">-</span><span class="n">y</span> +<span class="n">sudo</span> <span class="n">reboot</span> +</pre></div> + + +<h3 id="2sshuttle">2.用sshuttle翻墙<a class="headerlink" href="#2sshuttle" title="Permanent link">&para;</a></h3> +<p>(ubuntu下)首先安装它: <br /> +<code>sudo apt-get install sshuttle</code> <br /> +<code>sshuttle -r action@apne1.nitrousbox.com:22411 0.0.0.0/0 -vv</code> <br /> +搞定 , 就这么简单 注意action@apne1.nitrousbox.com:22411是我的ssh,你可以用你自己的,格式为username@sshserver, +我把sshserver理解为跳板机,在我的需求中,需要有一个国外的ssh账号,你有国外的vps的话就好办了,没有也没关系,感谢云平台的的兴起,我们只要注册(nitrous)[https://www.nitrous.io],就能有一个免费的ssh账号.</p> +<p>如果你使用(nitrous)[https://www.nitrous.io]记得每次使用时登录后把它打开.</p> +<h3 id="3one-step-installation">3.One step installation<a class="headerlink" href="#3one-step-installation" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">wget</span> <span class="n">https</span><span class="o">:</span><span class="c1">//raw.github.com/edx/configuration/master/util/install/vagrant.sh -O - | bash</span> +</pre></div> + + +<h3 id="4">4.防止出错<a class="headerlink" href="#4" title="Permanent link">&para;</a></h3> +<h6 id="nltk">上一步中,因为自动化脚本涉及到下载nltk包,由于我们翻墙了,网速可能会较慢,长时间下载(很有可能会出错),我们不想等待,如下操作。当然,如果你执意要等,不用做如下的操作<a class="headerlink" href="#nltk" title="Permanent link">&para;</a></h6> +<h4 id="nltk_1">手动下载nltk<a class="headerlink" href="#nltk_1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">cd</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">tmp</span> +<span class="n">wget</span> <span class="n">http</span><span class="o">:</span><span class="c1">//edx-static.s3.amazonaws.com/nltk/nltk-data-20131113.tar.gz</span> +<span class="n">chmod</span> <span class="n">o</span><span class="o">+</span><span class="n">rw</span> <span class="n">nltk</span><span class="o">-</span><span class="n">data</span><span class="o">-</span><span class="mf">20131113.</span><span class="n">tar</span><span class="p">.</span><span class="n">gz</span> +</pre></div> + + +<p>修改<code>/var/tmp/configuration/playbooks/edx-east/roles/ora/tasks/ease.yml</code> 中的<code>download and install nltk</code>任务内容为:</p> +<div class="highlight"><pre><span class="o">-</span> <span class="n">name</span><span class="o">:</span> <span class="n">download</span> <span class="n">and</span> <span class="n">install</span> <span class="n">nltk</span> + <span class="nl">shell:</span> <span class="o">|</span> + <span class="n">set</span> <span class="o">-</span><span class="n">e</span> + <span class="n">cp</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">nltk</span><span class="o">-</span><span class="n">data</span><span class="o">-</span><span class="mf">20131113.</span><span class="n">tar</span><span class="p">.</span><span class="n">gz</span> <span class="p">{{</span> <span class="n">ora_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">tar</span> <span class="n">zxf</span> <span class="p">{{</span> <span class="n">ora_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">rm</span> <span class="o">-</span><span class="n">f</span> <span class="p">{{</span> <span class="n">ora_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">touch</span> <span class="p">{{</span> <span class="n">ora_nltk_download_url</span><span class="o">|</span><span class="n">basename</span> <span class="p">}}</span><span class="o">-</span><span class="n">installed</span> + <span class="n">creates</span><span class="o">=</span><span class="p">{{</span> <span class="n">ora_data_dir</span> <span class="p">}}</span><span class="o">/</span><span class="p">{{</span> <span class="n">ora_nltk_download_url</span><span class="o">|</span><span class="n">basename</span> <span class="p">}}</span><span class="o">-</span><span class="n">installed</span> + <span class="n">chdir</span><span class="o">=</span><span class="p">{{</span> <span class="n">ora_data_dir</span> <span class="p">}}</span> + <span class="nl">sudo_user:</span> <span class="s">&quot;{{ common_web_user }}&quot;</span> + <span class="nl">notify:</span> + <span class="o">-</span> <span class="n">restart</span> <span class="n">ora</span> + <span class="o">-</span> <span class="n">restart</span> <span class="n">ora_celery</span> +</pre></div> + + +<p>修改<code>/var/tmp/configuration/playbooks/edx-east/roles/discern/tasks/deploy.yml</code> 中的<code>download and install nltk</code>任务内容为</p> +<div class="highlight"><pre><span class="o">-</span> <span class="n">name</span><span class="o">:</span> <span class="n">download</span> <span class="n">and</span> <span class="n">install</span> <span class="n">nltk</span> + <span class="nl">shell:</span> <span class="o">|</span> + <span class="n">set</span> <span class="o">-</span><span class="n">e</span> + <span class="n">cp</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">nltk</span><span class="o">-</span><span class="n">data</span><span class="o">-</span><span class="mf">20131113.</span><span class="n">tar</span><span class="p">.</span><span class="n">gz</span> <span class="p">{{</span> <span class="n">discern_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">tar</span> <span class="n">zxf</span> <span class="p">{{</span> <span class="n">discern_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">rm</span> <span class="o">-</span><span class="n">f</span> <span class="p">{{</span> <span class="n">discern_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">touch</span> <span class="p">{{</span> <span class="n">discern_nltk_download_url</span><span class="o">|</span><span class="n">basename</span> <span class="p">}}</span><span class="o">-</span><span class="n">installed</span> + <span class="n">creates</span><span class="o">=</span><span class="p">{{</span> <span class="n">discern_data_dir</span> <span class="p">}}</span><span class="o">/</span><span class="p">{{</span> <span class="n">discern_nltk_download_url</span><span class="o">|</span><span class="n">basename</span> <span class="p">}}</span><span class="o">-</span><span class="n">installed</span> + <span class="n">chdir</span><span class="o">=</span><span class="p">{{</span> <span class="n">discern_data_dir</span> <span class="p">}}</span> + <span class="nl">sudo_user:</span> <span class="s">&quot;{{ discern_user }}&quot;</span> + <span class="nl">notify:</span> + <span class="o">-</span> <span class="n">restart</span> <span class="n">discern</span> +</pre></div> + + +<h5 id="django143">手动安装<code>django==1.4.3</code><a class="headerlink" href="#django143" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">sudo</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">app</span><span class="o">/</span><span class="n">venvs</span><span class="o">/</span><span class="n">ora</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">pip</span> <span class="n">install</span> <span class="n">django</span><span class="o">==</span><span class="mf">1.4.3</span> +</pre></div> + + +<p>将<code>/edx/app/ora/ora/requirements.txt</code>里的<code>django==1.4.3</code>注释掉</p> +<hr /> +<h6 id="_1">安装的过程中,可能因为各种原因自动化脚本报错而停止,修复完问题后,可用如下命令从出错的位置开始执行<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h6> +<p><code>cd /var/tmp/configuration/playbooks &amp;&amp; sudo ansible-playbook -c local ./edx_sandbox.yml -i "localhost,"</code></p>翻墙之电脑篇2014-03-08T00:00:00+08:00Wontag:wbowam.github.io,2014-03-08:fan-qiang-zhi-dian-nao-pian.html<p>之前用过Goagent代理翻墙,很好用,再次感叹Google是个伟大的公司,,, +相比用Goagent,下面的成Chrome插件更加简便。</p> +<hr /> +<h3 id="1">1. <a href="https://chrome.google.com/webstore/search/%E7%BF%BB%E5%A2%99?hl=zh-CN">红杏</a><a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<p>到google应用商店,装上即可,不过非VIP只能翻有限的网站。。。。。</p> +<h3 id="2-sshuttle">2. sshuttle<a class="headerlink" href="#2-sshuttle" title="Permanent link">&para;</a></h3> +<p>闲逛github时看到基于 python 的 sshuttle</p> +<p>sshuttle被称为穷人的VPN.就是说它是免费的.</p> +<p>仅仅免费其实不够诱人,让我动心的是它的简单,而且可以在纯命令行下使用.</p> +<p>理论上vpn也是可以在纯命令行下使用的,我先后按照几个教程,都未成功.当然图形界面配置vpn很简单.</p> +<p>可问题是我必须在远程服务器上使用vpn(当然是用ssh登陆), 更新部署代码 , 需要连接国外服务器.</p> +<h5 id="_1">如何使用<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<p>(ubuntu下)首先安装它: +<code>sudo apt-get install sshuttle</code><br /> +<code>sshuttle -r action@apne1.nitrousbox.com:22411 0.0.0.0/0 -vv</code> </p> +<p>搞定 , 就这么简单 注意action@apne1.nitrousbox.com:22411是我的ssh,你可以用你自己的,格式为username@sshserver, +我把sshserver理解为跳板机,在我的需求中,需要有一个国外的ssh账号,你有国外的vps的话就好办了,没有也没关系,感谢云平台的的兴起,我们只要注册(nitrous)[https://www.nitrous.io],就能有一个免费的ssh账号.</p> +<p>如果你使用(nitrous)[https://www.nitrous.io]记得每次使用时登录后把它打开.</p>使用ngrok将内网端口映射到外网2014-03-08T00:00:00+08:00Wontag:wbowam.github.io,2014-03-08:shi-yong-ngrokjiang-nei-wang-duan-kou-ying-she-dao-wai-wang.html<h3 id="1">1.用法一:<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<p><code>./ngrok 80</code><br /> +这样会随机生成域名,若想定制域名看看方法二</p> +<h3 id="2">2.用法二:<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<h6 id="ngrokgithubauth-token7fsiqiigllgctzbucerv">登录ngrok官网,注册(可以直接用github帐号登录),获取<code>auth token</code>,如下面的<code>7FsiQIIGllGctZbUcERV</code>是我的,共享给大家使用<a class="headerlink" href="#ngrokgithubauth-token7fsiqiigllgctzbucerv" title="Permanent link">&para;</a></h6> +<h5 id="specify-your-auth-token">第一次使用时,本地用如下指令specify your auth token<a class="headerlink" href="#specify-your-auth-token" title="Permanent link">&para;</a></h5> +<p><code>ngrok -authtoken 7FsiQIIGllGctZbUcERV 80</code> <br /> +生成后可以取消</p> +<h5 id="80httptulparngrokcom">如下命令:映射80端口,使用二级域名:http://tulpar.ngrok.com<a class="headerlink" href="#80httptulparngrokcom" title="Permanent link">&para;</a></h5> +<p><code>./ngrok --subdomain tulpar 80</code></p>Xadmin入门2014-03-05T00:00:00+08:00Wontag:wbowam.github.io,2014-03-05:xadminru-men.html<p>之前用过一次Xadmin,很好。这一次又想用,竟然忘了怎么用,又得重头入门。之前写过印象笔记,如今翻来翻去,很杂,很乱,想当初真该写个博文的。这一次一定! </p> +<p>ENV:<br /> +python 2.7.3<br /> +Django 1.4.5<br /> +virtualenv 1.11.4 </p> +<hr /> +<h2 id="_1">.安装配置<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2> +<h4 id="1-install-xadmin">1. install xadmin<a class="headerlink" href="#1-install-xadmin" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">pip</span> <span class="n">install</span> <span class="n">django</span><span class="o">-</span><span class="n">xadmin</span> +</pre></div> + + +<h4 id="2">2.检查下列依赖包有没有都被安装<a class="headerlink" href="#2" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">django</span> <span class="o">&gt;=</span><span class="mf">1.4</span> +<span class="n">django</span><span class="o">-</span><span class="n">crispy</span><span class="o">-</span><span class="n">forms</span> <span class="o">&gt;=</span><span class="mf">1.2.3</span> <span class="p">(</span><span class="n">For</span> <span class="n">xadmin</span> <span class="n">crispy</span> <span class="n">forms</span><span class="p">)</span> +<span class="n">django</span><span class="o">-</span><span class="n">reversion</span> <span class="p">([</span><span class="n">OPTION</span><span class="p">]</span> <span class="n">For</span> <span class="n">object</span> <span class="n">history</span> <span class="n">and</span> <span class="n">reversion</span> <span class="n">feature</span><span class="p">,</span> <span class="n">please</span> <span class="n">select</span> <span class="n">right</span> <span class="n">version</span> <span class="n">by</span> <span class="n">your</span> <span class="n">django</span><span class="p">,</span> <span class="n">see</span> <span class="n">changelog</span> <span class="p">)</span> +<span class="n">xlwt</span> <span class="p">([</span><span class="n">OPTION</span><span class="p">]</span> <span class="n">For</span> <span class="n">export</span> <span class="n">xls</span> <span class="n">files</span><span class="p">)</span> +<span class="n">xlsxwriter</span> <span class="p">([</span><span class="n">OPTION</span><span class="p">]</span> <span class="n">For</span> <span class="n">export</span> <span class="n">xlsx</span> <span class="n">files</span><span class="p">)</span> +</pre></div> + + +<h4 id="3-xadmin-django">3. Xadmin 作为 Django 的模块,<a class="headerlink" href="#3-xadmin-django" title="Permanent link">&para;</a></h4> +<p>首先编辑 settings.py 添加 Xadmin 的模块到 INSTALLED_APPS 中 (注意, 安装 Django admin 所需要的 APP 也要安装, 但是 django.admin 可以不安装): </p> +<p>INSTALL_APPS</p> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> + +<span class="n">INSTALLED_APPS</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">contenttypes</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sessions</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sites</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">messages</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">staticfiles</span><span class="err">&#39;</span><span class="p">,</span> + + <span class="err">#&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">admin</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="err">这个可以去掉</span> + +<span class="cp">##添加模块</span> + <span class="err">&#39;</span><span class="n">xadmin</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">crispy_forms</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">#</span> <span class="err">&#39;</span><span class="n">reversion</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="err">需要</span><span class="n">pip</span> <span class="n">install</span> <span class="n">django</span><span class="o">-</span><span class="n">reversion</span> + +<span class="p">)</span> +</pre></div> + + +<p>其中<code>xadmin</code>依赖<code>crispy_forms</code>默认安装,依赖<code>reversion</code>可选</p> +<h4 id="4-url-patterns-autodiscover">4. 然后添加 URL-patterns 以及 autodiscover 操作:<a class="headerlink" href="#4-url-patterns-autodiscover" title="Permanent link">&para;</a></h4> +<p>urls.py 添加</p> +<div class="highlight"><pre><span class="n">import</span> <span class="n">xadmin</span> +<span class="n">xadmin</span><span class="p">.</span><span class="n">autodiscover</span><span class="p">()</span> + +<span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="err">&#39;&#39;</span><span class="p">,</span> + <span class="n">url</span><span class="p">(</span><span class="n">r</span><span class="err">&#39;</span><span class="o">^</span><span class="err">$&#39;</span><span class="p">,</span> <span class="n">IndexView</span><span class="p">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">home</span><span class="err">&#39;</span><span class="p">),</span> + + <span class="n">url</span><span class="p">(</span><span class="n">r</span><span class="err">&#39;</span><span class="o">^</span><span class="n">xadmin</span><span class="o">/</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="n">xadmin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="n">urls</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">xadmin</span><span class="err">&#39;</span><span class="p">),</span> + + <span class="err">#</span><span class="p">...</span> +<span class="p">)</span> +</pre></div> + + +<p>当然得注释admin相关配置</p> +<h4 id="5-media">5. 收集 media 文件:<a class="headerlink" href="#5-media" title="Permanent link">&para;</a></h4> +<p><code>python manage.py collectstatic</code></p> +<h4 id="6appadminxpy">6.注册数据:app内写一个adminx.py<a class="headerlink" href="#6appadminxpy" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">import</span> <span class="n">xadmin</span> +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">New</span> + +<span class="n">xadmin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">New</span><span class="p">)</span> +</pre></div> + + +<h4 id="7">7. 配置后台界面,主题,图标什么的<a class="headerlink" href="#7" title="Permanent link">&para;</a></h4> +<hr /> +<p>效果图 <br /> +<img alt="test" src="http://tulparblog.qiniudn.com/xadmin1.png" /></p>汉化edx-platform2014-02-09T00:00:00+08:00Wontag:wbowam.github.io,2014-02-09:yi-hua-edx-platform.html<h5 id="edx-paltform">搭建好edx-paltform 之后,需要定制:汉化,处理视频存储问题,定制前台。<a class="headerlink" href="#edx-paltform" title="Permanent link">&para;</a></h5> +<h5 id="fmyzjs">此文讲解汉化。谢谢<a href="http://d.edustack.org/t/edx-platform/40">fmyzjs</a>,<a href="http://www.idefs.comr/recordsedx-platform-internationalization-i18n.html">竹轩小站</a><a class="headerlink" href="#fmyzjs" title="Permanent link">&para;</a></h5> +<h3 id="1">1.准备<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<ul> +<li>基本的linux运维知识</li> +<li>部署成功的edx平台(如果没有可以去edustack.org下载我们的测试镜像)</li> +<li>transifex账号(OpenEdx翻译项目是在transifex.com上,有兴趣的同学可以参与进来)</li> +<li>耐心 +最后提醒,请不要使用root用户,必要时请使用sudo,如果您执意,GoodBye!</li> +</ul> +<hr /> +<h3 id="2transifex">2.安装transifex客户端<a class="headerlink" href="#2transifex" title="Permanent link">&para;</a></h3> +<p><code>sudo apt-get install transifex-client</code></p> +<h3 id="3transifex">3.在用户家目录新建transifex配置文件并编辑<a class="headerlink" href="#3transifex" title="Permanent link">&para;</a></h3> +<p><code>vi ~/.transifexrc</code></p> +<h5 id="_1">写入以下内容<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="k">[https://www.transifex.com]</span> +<span class="na">hostname</span> <span class="o">=</span> <span class="s">https://www.transifex.com</span> +<span class="na">username</span> <span class="o">=</span> <span class="s">user</span> +<span class="na">password</span> <span class="o">=</span> <span class="s">pass</span> +<span class="na">token</span> <span class="o">=</span> +</pre></div> + + +<h5 id="usernamepasswordtoken">其中请将username和password改成您自己的用户名和密码,token留空<a class="headerlink" href="#usernamepasswordtoken" title="Permanent link">&para;</a></h5> +<h3 id="4transifexrc">4.修改.transifexrc文件权限<a class="headerlink" href="#4transifexrc" title="Permanent link">&para;</a></h3> +<p><code>chmod o+rw ~/.transifexrc</code></p> +<h3 id="5edxapp">5.切换到edxapp用户并加载对应的环境变量<a class="headerlink" href="#5edxapp" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="o">-</span><span class="n">u</span> <span class="n">edxapp</span> <span class="n">bash</span> +<span class="n">source</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">app</span><span class="o">/</span><span class="n">edxapp</span><span class="o">/</span><span class="n">edxapp_env</span> +<span class="n">cd</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">app</span><span class="o">/</span><span class="n">edxapp</span><span class="o">/</span><span class="n">edx</span><span class="o">-</span><span class="n">platform</span> +</pre></div> + + +<h3 id="6msenvjson">6.修改*ms.env.json文件<a class="headerlink" href="#6msenvjson" title="Permanent link">&para;</a></h3> +<p><code>vim ../lms.env.json</code></p> +<h5 id="lmsenvjson">lms.env.json添加以下内容<a class="headerlink" href="#lmsenvjson" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="s">&quot;USE_I18N&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span> +<span class="s">&quot;LANGUAGE_CODE&quot;</span><span class="o">:</span> <span class="s">&quot;zh-cn&quot;</span> +</pre></div> + + +<p><code>vim ../cms.env.json</code></p> +<h5 id="cmsenvjson">cms.env.json添加以下内容<a class="headerlink" href="#cmsenvjson" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="s">&quot;USE_I18N&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span> +<span class="s">&quot;LANGUAGE_CODE&quot;</span><span class="o">:</span> <span class="s">&quot;zh-cn&quot;</span> +</pre></div> + + +<h3 id="7">7.执行翻译(请注意我说的是翻译,不是汉化,因为这不仅仅是汉化)<a class="headerlink" href="#7" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">tx</span> <span class="n">pull</span> <span class="o">-</span><span class="n">l</span> <span class="n">zh_CN</span> +<span class="n">python</span> <span class="p">.</span><span class="o">/</span><span class="n">i18n</span><span class="o">/</span><span class="n">generate</span><span class="p">.</span><span class="n">py</span> +</pre></div> + + +<h3 id="8assets">8.更新assets<a class="headerlink" href="#8assets" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">paver</span> <span class="n">update_assets</span> <span class="n">lms</span> <span class="o">--</span><span class="n">settings</span> <span class="n">aws</span> +<span class="n">paver</span> <span class="n">update_assets</span> <span class="n">cms</span> <span class="o">--</span><span class="n">settings</span> <span class="n">aws</span> +</pre></div> + + +<h3 id="9edxappedxapp">9.退出edxapp用户并重启edxapp<a class="headerlink" href="#9edxappedxapp" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">exit</span> +<span class="n">sudo</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">supervisorctl</span> <span class="o">-</span><span class="n">c</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">supervisord</span><span class="p">.</span><span class="n">conf</span> <span class="n">restart</span> <span class="n">edxapp</span><span class="o">:</span> +</pre></div>Linux特别强大和灵活的命令行工具 (1)2014-02-08T00:00:00+08:00Wontag:wbowam.github.io,2014-02-08:linuxte-bie-qiang-da-he-ling-huo-de-ming-ling-xing-gong-ju-1.html<h4 id="_1">! ياخشى نەرسە سېسىپ قالمىسۇن<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<hr /> +<h3 id="curl">Curl<a class="headerlink" href="#curl" title="Permanent link">&para;</a></h3> +<p>Curl是一个网络传输工具,这是非常类似wget的,主要的区别在于,默认情况下,Wget的保存到一个文件,和curl的命令行输出。这使得它可以很简单,看一个网站的内容。这里举个例子,我们可以得到我们当前的IP从ifconfig.me网站:</p> +<div class="highlight"><pre><span class="n">curl</span> <span class="n">ifconfig</span><span class="p">.</span><span class="n">me</span> +<span class="mf">93.96.141.93</span> +</pre></div> + + +<p>Curl的-i(显示标题)和-I(只显示头)选项使其成为一个伟大的工具,调试HTTP响应,并找出到底什么是服务器发送到你的:</p> +<div class="highlight"><pre><span class="n">curl</span> <span class="o">-</span><span class="n">I</span> <span class="n">news</span><span class="p">.</span><span class="n">ycombinator</span><span class="p">.</span><span class="n">com</span> +<span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span> +<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="o">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">utf</span><span class="o">-</span><span class="mi">8</span> +<span class="n">Cache</span><span class="o">-</span><span class="n">Control</span><span class="o">:</span> <span class="n">private</span> +<span class="nl">Connection:</span> <span class="n">close</span> +</pre></div> + + +<p>-L选项是非常方便的,curl自动跟踪重定向。curl支持HTTP基本身份验证,cookies,手动设定标题等。</p> +<hr /> +<h3 id="netcat">netcat<a class="headerlink" href="#netcat" title="Permanent link">&para;</a></h3> +<p>netcat或nc被称为网络上的瑞士军刀。这是一个非常简单但也非常强大和灵活的应用程序,允许你创建任意的网络连接。在这里,我们看到它被用作一个端口扫描器:</p> +<div class="highlight"><pre><span class="n">nc</span> <span class="o">-</span><span class="n">z</span> <span class="n">example</span><span class="p">.</span><span class="n">com</span> <span class="mi">20</span><span class="o">-</span><span class="mi">100</span> +<span class="n">Connection</span> <span class="n">to</span> <span class="n">example</span><span class="p">.</span><span class="n">com</span> <span class="mi">22</span> <span class="n">port</span> <span class="p">[</span><span class="n">tcp</span><span class="o">/</span><span class="n">ssh</span><span class="p">]</span> <span class="n">succeeded</span><span class="o">!</span> +<span class="n">Connection</span> <span class="n">to</span> <span class="n">example</span><span class="p">.</span><span class="n">com</span> <span class="mi">80</span> <span class="n">port</span> <span class="p">[</span><span class="n">tcp</span><span class="o">/</span><span class="n">http</span><span class="p">]</span> <span class="n">succeeded</span><span class="o">!</span> +</pre></div> + + +<p>除了 建立任意的连接,netcat的还可以侦听传入的连接。在这里,我们使用nc的这一特点,结合tar命令,非常迅速地和有效地在服务器之间复制文件。 +在服务器上,运行以下命令:</p> +<div class="highlight"><pre><span class="n">nc</span> <span class="o">-</span><span class="n">l</span> <span class="mi">9090</span> <span class="o">|</span><span class="n">tar</span> <span class="o">-</span><span class="n">xzf</span> <span class="o">-</span> +</pre></div> + + +<p>在客户端:</p> +<div class="highlight"><pre><span class="n">tar</span> <span class="o">-</span><span class="n">czf</span> <span class="n">dir</span><span class="o">/|</span><span class="n">nc</span> <span class="n">service_ip</span> <span class="mi">9090</span> +</pre></div> + + +<p>我们可以使用netcat建立在网络上的任何应用程序。在这里,我们建立了一个8080端口的shell:</p> +<div class="highlight"><pre><span class="n">mkfifo</span> <span class="n">backpipe</span> +<span class="n">nc</span> <span class="o">-</span><span class="n">l</span> <span class="mi">8080</span> <span class="mi">0</span> <span class="o">&lt;</span><span class="n">backpipe</span> <span class="o">|</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">bash</span><span class="o">&gt;</span> <span class="n">backpipe</span> +</pre></div> + + +<p>现在,我们可以从任何客户端访问服务器:</p> +<div class="highlight"><pre><span class="n">nc</span> <span class="n">example</span><span class="p">.</span><span class="n">com</span> <span class="mi">8080</span> +<span class="n">uname</span><span class="o">-</span><span class="n">a</span> +<span class="n">Linux</span> <span class="n">li228</span><span class="o">-</span><span class="mi">162</span> <span class="mf">2.6.39.1</span><span class="o">-</span><span class="n">linode34</span> <span class="err">##</span><span class="mi">1</span> <span class="n">SMP</span> <span class="n">Tue</span> <span class="n">Jun</span> <span class="mi">21</span> <span class="mi">10</span><span class="o">:</span><span class="mi">29</span><span class="o">:</span><span class="mi">24</span> <span class="n">EDT</span> <span class="mi">2011</span> <span class="n">i686</span> <span class="n">GNU</span><span class="o">/</span><span class="n">Linux</span> +</pre></div> + + +<p>虽然最后的两个例子是有点做作的(在现实中,你会更容易使用的工具,如rsync复制文件和SSH远程访问服务器),也显示在所有的netcat的力量和灵活性,并暗示不同的事情,你可以通过与其他应用程序相结合的netcat的。</p> +<hr /> +<h3 id="sshuttle">sshuttle<a class="headerlink" href="#sshuttle" title="Permanent link">&para;</a></h3> +<hr /> +<h3 id="siege">Siege<a class="headerlink" href="#siege" title="Permanent link">&para;</a></h3> +<p>Siege是一个HTTP的基准测试工具。除了负载测试功能,它有一个方便的-g选项,这是非常类似于curl的-iL,显示你的请求报头。下面是一个例子(为简便起见,我删除了一些头文件):</p> +<div class="highlight"><pre><span class="n">siege</span> <span class="o">-</span><span class="n">g</span> <span class="n">www</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span> +<span class="n">GET</span> <span class="o">/</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> +<span class="nl">Host:</span> <span class="n">www</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span> +<span class="n">User</span><span class="o">-</span><span class="n">Agent</span><span class="o">:</span> <span class="n">JoeDog</span><span class="o">/</span><span class="mf">1.00</span> <span class="p">[</span><span class="n">en</span><span class="p">]</span> <span class="p">(</span><span class="n">X11</span><span class="p">;</span> <span class="n">I</span><span class="p">;</span> <span class="n">Siege</span> <span class="mf">2.70</span><span class="p">)</span> <span class="n">Connection</span><span class="o">:</span> <span class="n">close</span> + +<span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">302</span> <span class="n">Found</span> +<span class="nl">Location:</span> <span class="n">http</span><span class="o">:</span><span class="c1">//www.google.co.uk/</span> +<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="o">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span> +<span class="nl">Server:</span> <span class="n">gws</span> +<span class="n">Content</span><span class="o">-</span><span class="n">Length</span><span class="o">:</span> <span class="mi">221</span> +<span class="nl">Connection:</span> <span class="n">close</span> + +<span class="n">GET</span> <span class="o">/</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> +<span class="nl">Host:</span> <span class="n">www</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">co</span><span class="p">.</span><span class="n">uk</span> +<span class="n">User</span><span class="o">-</span><span class="n">Agent</span><span class="o">:</span> <span class="n">JoeDog</span><span class="o">/</span><span class="mf">1.00</span> <span class="p">[</span><span class="n">en</span><span class="p">]</span> <span class="p">(</span><span class="n">X11</span><span class="p">;</span> <span class="n">I</span><span class="p">;</span> <span class="n">Siege</span> <span class="mf">2.70</span><span class="p">)</span> +<span class="nl">Connection:</span> <span class="n">close</span> + +<span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span> +<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="o">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">ISO</span><span class="o">-</span><span class="mi">8859</span><span class="o">-</span><span class="mi">1</span> +<span class="n">X</span><span class="o">-</span><span class="n">XSS</span><span class="o">-</span><span class="n">Protection</span><span class="o">:</span> <span class="mi">1</span><span class="p">;</span> <span class="n">mode</span><span class="o">=</span><span class="n">block</span> +<span class="nl">Connection:</span> <span class="n">close</span> +</pre></div> + + +<p>Siege是真正伟大的是服务器负载测试。就像ab(Apache的HTTP服务器基准测试工具),你可以向一个网站发送的并发请求数,看看它是如何处理的交通。用下面的命令,我们将测试 +谷歌利用20个并发连接30秒,然后结束时得到一个很好的报告:</p> +<div class="highlight"><pre><span class="n">siege</span> <span class="o">-</span><span class="n">c20</span> <span class="n">www</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">co</span><span class="p">.</span><span class="n">uk</span> <span class="o">-</span><span class="n">b</span> <span class="o">-</span><span class="n">t30s</span> +<span class="err">…</span> +<span class="n">Lifting</span> <span class="n">the</span> <span class="n">server</span> <span class="n">siege</span><span class="err">…</span> <span class="n">done</span><span class="p">.</span> +<span class="nl">Transactions:</span> <span class="mi">1400</span> <span class="n">hits</span> +<span class="nl">Availability:</span> <span class="mf">100.00</span> <span class="o">%</span> +<span class="n">Elapsed</span> <span class="n">time</span><span class="o">:</span> <span class="mf">29.22</span> <span class="n">secs</span> +<span class="n">Data</span> <span class="n">transferred</span><span class="o">:</span> <span class="mf">13.32</span> <span class="n">MB</span> +<span class="n">Response</span> <span class="n">time</span><span class="o">:</span> <span class="mf">0.41</span> <span class="n">secs</span> +<span class="n">Transaction</span> <span class="n">rate</span><span class="o">:</span> <span class="mf">47.91</span> <span class="n">trans</span><span class="o">/</span><span class="n">sec</span> +<span class="nl">Throughput:</span> <span class="mf">0.46</span> <span class="n">MB</span><span class="o">/</span><span class="n">sec</span> +<span class="nl">Concurrency:</span> <span class="mf">19.53</span> +<span class="n">Successful</span> <span class="n">transactions</span><span class="o">:</span> <span class="mi">1400</span> +<span class="n">Failed</span> <span class="n">transactions</span><span class="o">:</span> <span class="mi">0</span> +<span class="n">Longest</span> <span class="n">transaction</span><span class="o">:</span> <span class="mf">4.08</span> +<span class="n">Shortest</span> <span class="n">transaction</span><span class="o">:</span> <span class="mf">0.08</span> +</pre></div> + + +<p>siege的最有用的功能之一是,它可以采取一个文件的URL作为输入,然后点击这些URL,而不仅仅是一个单一的页面。进行负载测试,这是伟大的,因为你可以重放实时交通对您的网站,看看它是如何执行的,而不是只打一遍又一遍相同的URL。在这里将教你如何使用siege在另一台服务器上实现Apache日志的重播:</p> +<div class="highlight"><pre><span class="n">cut</span> <span class="o">-</span><span class="n">d</span> <span class="err">‘</span> <span class="err">‘</span> <span class="o">-</span><span class="n">f7</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">log</span><span class="o">/</span><span class="n">apache2</span><span class="o">/</span><span class="n">access</span><span class="p">.</span><span class="n">log</span> <span class="o">&gt;</span> <span class="n">urls</span><span class="p">.</span><span class="n">txt</span> +<span class="n">siege</span> <span class="o">-</span><span class="n">c</span><span class="o">&lt;</span><span class="n">concurrency</span> <span class="n">rate</span><span class="o">&gt;</span> <span class="o">-</span><span class="n">b</span> <span class="o">-</span><span class="n">f</span> <span class="n">urls</span><span class="p">.</span><span class="n">txt</span> +</pre></div>使用Edx platform2014-02-08T00:00:00+08:00Wontag:wbowam.github.io,2014-02-08:shi-yong-edx-platform.html<h3 id="1-create-superuser">1. create superuser<a class="headerlink" href="#1-create-superuser" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="o">-</span><span class="n">u</span> <span class="n">www</span><span class="o">-</span><span class="n">data</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span> +<span class="n">bin</span><span class="o">/</span><span class="n">python</span><span class="p">.</span><span class="n">edxapp</span> <span class="p">.</span><span class="o">/</span><span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">lms</span> <span class="o">--</span><span class="n">settings</span> <span class="n">aws</span> <span class="n">create_user</span> <span class="o">-</span><span class="n">e</span> <span class="n">user</span><span class="err">@</span><span class="n">example</span><span class="p">.</span><span class="n">com</span> +<span class="n">sudo</span> <span class="o">-</span><span class="n">u</span> <span class="n">www</span><span class="o">-</span><span class="n">data</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">python</span><span class="p">.</span><span class="n">edxapp</span> <span class="p">.</span><span class="o">/</span><span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">lms</span> <span class="o">--</span><span class="n">settings</span> <span class="n">aws</span> <span class="n">changepassword</span> <span class="n">user</span> +<span class="n">sudo</span> <span class="o">-</span><span class="n">u</span> <span class="n">www</span><span class="o">-</span><span class="n">data</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">python</span><span class="p">.</span><span class="n">edxapp</span> <span class="p">.</span><span class="o">/</span><span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">lms</span> <span class="o">--</span><span class="n">settings</span> <span class="n">aws</span> <span class="n">shell</span> + +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">User</span> +<span class="n">me</span> <span class="o">=</span> <span class="n">User</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">username</span><span class="o">=</span><span class="s">&quot;user&quot;</span><span class="p">)</span> +<span class="n">me</span><span class="p">.</span><span class="n">is_superuser</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">me</span><span class="p">.</span><span class="n">is_staff</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">me</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +</pre></div> + + +<h3 id="2">2. 虚拟机配置网桥<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<h5 id="1-vagrantvagrantfile">(1) 配置vagrant(改Vagrantfile文件)<a class="headerlink" href="#1-vagrantvagrantfile" title="Permanent link">&para;</a></h5> +<p>回到项目起始目录,如我的是</p> +<div class="highlight"><pre><span class="n">pwd</span> +<span class="o">~/</span><span class="n">workplace</span><span class="o">/</span><span class="n">fullstack</span><span class="err">$</span> +<span class="n">ls</span> <span class="o">~/</span><span class="n">workplace</span><span class="o">/</span><span class="n">fullstack</span> +<span class="mi">20140418</span><span class="o">-</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="p">.</span><span class="n">box</span> <span class="n">Vagrantfile</span> +</pre></div> + + +<p>更改Networking方式,默认是host-only模式,如下:</p> +<div class="highlight"><pre><span class="n">config</span><span class="p">.</span><span class="n">vm</span><span class="p">.</span><span class="n">network</span> <span class="o">:</span><span class="n">private_network</span><span class="p">,</span> <span class="n">ip</span><span class="o">:</span> <span class="s">&quot;192.168.33.10&quot;</span> +</pre></div> + + +<p>改成:</p> +<div class="highlight"><pre><span class="n">config</span><span class="p">.</span><span class="n">vm</span><span class="p">.</span><span class="n">network</span> <span class="s">&quot;public_network&quot;</span><span class="p">,</span> <span class="o">:</span><span class="n">bridge</span> <span class="o">=&gt;</span> <span class="err">&#39;</span><span class="n">eth0</span><span class="err">&#39;</span> +</pre></div> + + +<p>添加IP和Port</p> +<div class="highlight"><pre><span class="n">config</span><span class="p">.</span><span class="n">ssh</span><span class="p">.</span><span class="n">host</span> <span class="o">=</span> <span class="s">&quot;202.206.221.119&quot;</span> +<span class="n">config</span><span class="p">.</span><span class="n">ssh</span><span class="p">.</span><span class="n">port</span> <span class="o">=</span> <span class="s">&quot;22&quot;</span> +</pre></div> + + +<p>以上<code>config.ssh.host</code> 和<code>config.ssh.port</code>默认127.0.0.1:2222和22</p> +<h5 id="2-networkingnatvirtualbox">(2) 更改虚拟机的Networking方式,默认是NAT模式,我用的是virtualbox<a class="headerlink" href="#2-networkingnatvirtualbox" title="Permanent link">&para;</a></h5> +<p><img alt="virtualbox" src="http://wwjpic.qiniudn.com/1.png" /></p> +<h5 id="3-ip">(3) 登录虚拟机,配置静态IP<a class="headerlink" href="#3-ip" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">vim</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">network</span><span class="o">/</span><span class="n">interfaces</span> +<span class="k">auto</span> <span class="n">eth0</span> +<span class="n">iface</span> <span class="n">eth0</span> <span class="n">inet</span> <span class="k">static</span> +<span class="n">address</span> <span class="mf">192.168.1.152</span> +<span class="n">gateway</span> <span class="mf">192.168.1.1</span> +<span class="n">netmask</span> <span class="mf">255.255.255.0</span> +<span class="n">network</span> <span class="mf">192.168.1.0</span> +<span class="n">broadcast</span> <span class="mf">192.168.1.255</span> +</pre></div> + + +<p>这样,IP并没有立即生效,重启网络服务</p> +<div class="highlight"><pre><span class="n">sudo</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">init</span><span class="p">.</span><span class="n">d</span><span class="o">/</span><span class="n">networking</span> <span class="n">restart</span> +</pre></div> + + +<h3 id="3edx">3.配置edx邮件服务<a class="headerlink" href="#3edx" title="Permanent link">&para;</a></h3> +<h5 id="cms">CMS<a class="headerlink" href="#cms" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">vim</span> <span class="o">/</span><span class="n">edx</span><span class="o">-</span><span class="n">platform</span><span class="o">/</span><span class="n">cms</span><span class="o">/</span><span class="n">envs</span><span class="o">/</span><span class="n">common</span><span class="p">.</span><span class="n">py</span> +</pre></div> + + +<p>配置#Email的内容,如下:</p> +<div class="highlight"><pre><span class="n">EMAIL_BACKEND</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">mail</span><span class="p">.</span><span class="n">backends</span><span class="p">.</span><span class="n">smtp</span><span class="p">.</span><span class="n">EmailBackend</span><span class="err">&#39;</span> +<span class="n">DEFAULT_FROM_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">mooc</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">DEFAULT_FEEDBACK_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">mooc</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">EMAIL_HOST</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">smtp</span><span class="p">.</span><span class="n">exmail</span><span class="p">.</span><span class="n">qq</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">EMAIL_HOST_USER</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">mooc</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">TECH_SUPPORT_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">root</span><span class="err">@</span><span class="n">idefs</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">CONTACT_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">mooc</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">SERVER_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">stack</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">BUGS_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">stack</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">EMAIL_HOST_PASSWORD</span> <span class="o">=</span> <span class="err">&#39;&#39;</span> +<span class="n">EMAIL_PORT</span> <span class="o">=</span> <span class="mi">465</span> +<span class="n">EMAIL_USE_TLS</span> <span class="o">=</span> <span class="err">&#39;</span><span class="nb">true</span><span class="err">&#39;</span> +<span class="n">ADMINS</span> <span class="o">=</span> <span class="p">(</span> +<span class="p">(</span><span class="err">&#39;</span><span class="n">edX</span> <span class="n">Admins</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">mooc</span><span class="err">&#39;</span><span class="p">),</span> +<span class="p">)</span> +</pre></div> + + +<h5 id="lms">Lms也是如此<a class="headerlink" href="#lms" title="Permanent link">&para;</a></h5> +<p>小编提示:配置好后,如果不正常,请检查所用邮箱,有可能会有以下问题:<br /> +1. 国外的邮件服务(如gmail),有可能被抢了<br /> +2. 你用的dns没法解析你所使用的smtp服务器(这种可能性很低,不过小编中了)。如我用的是smtp.qq.com,一直没法用,很不科学,找不到原因,最后抓包看了一下:原来我们学校dns服务器没能解析smtp.qq.com——蛋疼!</p>命令行下使用VirtualBox2014-01-08T00:00:00+08:00Wontag:wbowam.github.io,2014-01-08:ming-ling-xing-xia-shi-yong-virtualbox.html<p>有个小小的需求:ssh登录的远程服务器上,开启poweroff状态的VirtualBox虚拟机.......</p> +<p>需要学会在命令行下管理及使用VirtualBox, <br /> +下面只是一些基本的用法,只供入门。当然,如果你执意,也可以去看<a href="http://www.virtualbox.org/manual/ch08.html#idp6268864">VirtualBox文档</a></p> +<h3 id="_1">走起<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<hr /> +<h5 id="vboxmanage">一个命令可以满足我的需求,即VBoxManage<a class="headerlink" href="#vboxmanage" title="Permanent link">&para;</a></h5> +<h3 id="1-vboxmanage-startvm">1. VBoxManage startvm子命令可以开启一台状态为关闭或者保存的虚拟机。该命令的语法为:<a class="headerlink" href="#1-vboxmanage-startvm" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">VBoxManage</span> <span class="n">startvm</span> <span class="n">uuid</span><span class="o">&gt;|</span><span class="n">name</span><span class="p">...</span> <span class="p">[</span><span class="o">--</span><span class="n">type</span> <span class="n">gui</span><span class="o">|</span><span class="n">sdl</span><span class="o">|</span><span class="n">headless</span><span class="p">]</span> +</pre></div> + + +<h3 id="2-uuidnamelist">2. 可以通过虚拟机的uuid或者name来指定某台虚拟机,可以通过另外一个子命令list列出系统已有的虚拟机:<a class="headerlink" href="#2-uuidnamelist" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="err">$</span> <span class="n">VBoxManage</span> <span class="n">list</span> <span class="n">vms</span> +<span class="s">&quot;XP&quot;</span> <span class="p">{</span><span class="mi">8842</span><span class="n">d793</span><span class="o">-</span><span class="mi">228</span><span class="n">c</span><span class="o">-</span><span class="mi">458</span><span class="n">e</span><span class="o">-</span><span class="n">a880</span><span class="o">-</span><span class="mf">8051193f</span><span class="n">d2db</span><span class="p">}</span> +</pre></div> + + +<p>我系统上已经安装了一台名为XP的虚拟机,后面括号内部的是它的UUID。</p> +<h3 id="3vboxmanage-startvm-type">3.VBoxManage startvm子命令可以通过--type参数指定启动的方式<a class="headerlink" href="#3vboxmanage-startvm-type" title="Permanent link">&para;</a></h3> +<h4 id="gui">gui:图形化界面<a class="headerlink" href="#gui" title="Permanent link">&para;</a></h4> +<h4 id="sdl">sdl也是图形化界面,但是少掉了部分功能,比如没有菜单等,一般用于调试过程。<a class="headerlink" href="#sdl" title="Permanent link">&para;</a></h4> +<h4 id="headlessvrdp">headless:后台运行,并且默认开启vrdp服务,可以通过远程桌面工具来访问。<a class="headerlink" href="#headlessvrdp" title="Permanent link">&para;</a></h4> +<h5 id="_2">如:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h5> +<h6 id="gui_1">gui类型启动虚拟机:<a class="headerlink" href="#gui_1" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="err">$</span> <span class="n">VBoxManage</span> <span class="n">startvm</span> <span class="n">XP</span> <span class="o">--</span><span class="n">type</span> <span class="n">gui</span> +</pre></div> + + +<h6 id="headless">使用headless类型启动虚拟机:<a class="headerlink" href="#headless" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="err">$</span> <span class="n">VBoxManage</span> <span class="n">startvm</span> <span class="s">&quot;XP&quot;</span> <span class="o">--</span><span class="n">type</span> <span class="n">headless</span> +</pre></div> + + +<p>或者</p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">VBoxHeadless</span> <span class="o">--</span><span class="n">startvm</span> <span class="s">&quot;XP&quot;</span> +</pre></div>Ubuntu 用户用命令安装 VirtualBox 4.3.82014-01-08T00:00:00+08:00Wontag:wbowam.github.io,2014-01-08:ubuntu-yong-hu-yong-ming-ling-an-zhuang-virtualbox-438.html<p>今天在阿里云上安装virtualbox,发现阿里的源里只有4.1版本,可我需要4.3。 <br /> +换了国内其他的源发现太慢了,,,,于是,,,,, <br /> +wget deb 包本地安装,发现依赖很多东西,,,,<br /> +于是,,,,,,</p> +<hr /> +<h3 id="1">1.添加源<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<p><code>vim /etc/apt/sources.list</code><br /> +添加: </p> +<div class="highlight"><pre><span class="k">deb</span> <span class="s">http://download.virtualbox.org/virtualbox/debian</span> <span class="kp">precise</span> <span class="kp">contrib</span> +</pre></div> + + +<h3 id="2">2.添加钥匙:(这一步很关键)<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">wget</span> <span class="o">-</span><span class="n">q</span> <span class="n">http</span><span class="o">:</span><span class="c1">//download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -</span> +</pre></div> + + +<h3 id="3">3.更新源列表:<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">update</span> +</pre></div> + + +<h3 id="4-virtualbox">4.安装 virtualbox<a class="headerlink" href="#4-virtualbox" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">virtualbox</span><span class="o">-</span><span class="mf">4.3</span> +</pre></div>sshd_config配置2013-12-08T00:00:00+08:00Wontag:wbowam.github.io,2013-12-08:sshd_configpei-zhi.html<p>基本上,在您的系统中,『除非有必要,否则请不要更改 /etc/ssh/sshd_config 这个档案的设定值!』因为预设的情况下通常都是最严密的 SSH 保护了,因此,可以不需要更动他!上面的说明仅是在让大家了解每个细项的一些基本内容而已!需要注意的是最后一项,如果您不愿意开放 SFTP 的话,将最后一行批注掉即可! </p> +<hr /> +<div class="highlight"><pre><span class="cp">### 1. 关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式</span> +<span class="n">Port</span> <span class="mi">22</span><span class="err">          #</span> <span class="n">SSH</span> <span class="err">预设使用</span> <span class="mi">22</span> <span class="err">这个</span> <span class="n">port</span><span class="err">,您也可以使用多的</span> <span class="n">port</span> <span class="err">!</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">亦即重复使用</span> <span class="n">port</span> <span class="err">这个设定项目即可!</span> +<span class="n">Protocol</span> <span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="err">       </span> <span class="err">#</span> <span class="err">选择的</span> <span class="n">SSH</span> <span class="err">协议版本,可以是</span> <span class="mi">1</span> <span class="err">也可以是</span> <span class="mi">2</span> <span class="err">,</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">如果要同时支持两者,就必须要使用</span> <span class="mi">2</span><span class="p">,</span><span class="mi">1</span> <span class="err">这个分隔了!</span> +<span class="cp">#ListenAddress 0.0.0.0   # 监听的主机适配卡!举个例子来说,如果您有两个 IP,</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">分别是</span> <span class="mf">192.168.0.100</span> <span class="err">及</span> <span class="mf">192.168.2.20</span> <span class="err">,那么只想要</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">开放</span> <span class="mf">192.168.0.100</span> <span class="err">时,就可以写如同下面的样式:</span> +<span class="n">ListenAddress</span> <span class="mf">192.168.0.100</span> <span class="err">#</span> <span class="err">只监听来自</span> <span class="mf">192.168.0.100</span> <span class="err">这个</span> <span class="n">IP</span> <span class="err">的</span><span class="n">SSH</span><span class="err">联机。</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">如果不使用设定的话,则预设所有接口均接受</span> <span class="n">SSH</span> +<span class="n">PidFile</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">run</span><span class="o">/</span><span class="n">sshd</span><span class="p">.</span><span class="n">pid</span><span class="err">      #</span> <span class="err">可以放置</span> <span class="n">SSHD</span> <span class="err">这个</span> <span class="n">PID</span> <span class="err">的档案!左列为默认值</span> +<span class="n">LoginGraceTime</span> <span class="mi">600</span><span class="err">    </span> <span class="err">#</span> <span class="err">当使用者连上</span> <span class="n">SSH</span> <span class="n">server</span> <span class="err">之后,会出现输入密码的画面,</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">在该画面中,在多久时间内没有成功连上</span> <span class="n">SSH</span> <span class="n">server</span> <span class="err">,</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">就断线!时间为秒!</span> +<span class="n">Compression</span> <span class="n">yes</span><span class="err">      #</span> <span class="err">是否可以使用压缩指令?当然可以啰!</span> +<span class="err"> </span> +<span class="cp"># 2. 说明主机的 Private Key 放置的档案,预设使用下面的档案即可!</span> +<span class="n">HostKey</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">ssh</span><span class="o">/</span><span class="n">ssh_host_key</span><span class="err">    #</span> <span class="n">SSH</span> <span class="n">version</span> <span class="mi">1</span> <span class="err">使用的私钥</span> +<span class="n">HostKey</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">ssh</span><span class="o">/</span><span class="n">ssh_host_rsa_key</span><span class="err">  #</span> <span class="n">SSH</span> <span class="n">version</span> <span class="mi">2</span> <span class="err">使用的</span> <span class="n">RSA</span> <span class="err">私钥</span> +<span class="n">HostKey</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">ssh</span><span class="o">/</span><span class="n">ssh_host_dsa_key</span><span class="err">  #</span> <span class="n">SSH</span> <span class="n">version</span> <span class="mi">2</span> <span class="err">使用的</span> <span class="n">DSA</span> <span class="err">私钥</span> +<span class="cp"># 2.1 关于 version 1 的一些设定!</span> +<span class="n">KeyRegenerationInterval</span> <span class="mi">3600</span><span class="err"> </span> <span class="err">   #</span> <span class="err">由前面联机的说明可以知道,</span> <span class="n">version</span> <span class="mi">1</span> <span class="err">会使用</span> +<span class="err">                  </span> <span class="err">#</span> <span class="n">server</span> <span class="err">的</span> <span class="n">Public</span> <span class="n">Key</span> <span class="err">,那么如果这个</span> <span class="n">Public</span> +<span class="err">                  </span> <span class="err">#</span> <span class="n">Key</span> <span class="err">被偷的话,岂不完蛋?所以需要每隔一段时间</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">来重新建立一次!这里的时间为秒!</span> +<span class="n">ServerKeyBits</span> <span class="mi">768</span> <span class="err">         </span> <span class="err">#</span> <span class="err">没错!这个就是</span> <span class="n">Server</span> <span class="n">key</span> <span class="err">的长度!</span> +<span class="cp"># 3. 关于登录文件的讯息数据放置与 daemon 的名称!</span> +<span class="n">SyslogFacility</span> <span class="n">AUTH</span><span class="err">         #</span> <span class="err">当有人使用</span> <span class="n">SSH</span> <span class="err">登入系统的时候,</span><span class="n">SSH</span><span class="err">会记录资</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">讯,这个信息要记录在什么</span> <span class="n">daemon</span> <span class="n">name</span> <span class="err">底下?</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">预设是以</span> <span class="n">AUTH</span> <span class="err">来设定的,即是</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">log</span><span class="o">/</span><span class="n">secure</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">里面!什么?忘记了!回到</span> <span class="n">Linux</span> <span class="err">基础去翻一下</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">其它可用的</span> <span class="n">daemon</span> <span class="n">name</span> <span class="err">为:</span><span class="n">DAEMON</span><span class="p">,</span><span class="n">USER</span><span class="p">,</span><span class="n">AUTH</span><span class="p">,</span> +<span class="err">                  </span> <span class="err">#</span> <span class="n">LOCAL0</span><span class="p">,</span><span class="n">LOCAL1</span><span class="p">,</span><span class="n">LOCAL2</span><span class="p">,</span><span class="n">LOCAL3</span><span class="p">,</span><span class="n">LOCAL4</span><span class="p">,</span><span class="n">LOCAL5</span><span class="p">,</span> +<span class="n">LogLevel</span> <span class="n">INFO</span><span class="err">            #</span> <span class="err">登录记录的等级!嘿嘿!任何讯息!</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">同样的,忘记了就回去参考!</span> +<span class="cp"># 4. 安全设定项目!极重要!</span> +<span class="cp"># 4.1 登入设定部分</span> +<span class="n">PermitRootLogin</span> <span class="n">no</span><span class="err">  </span> <span class="err">  #</span> <span class="err">是否允许</span> <span class="n">root</span> <span class="err">登入!预设是允许的,但是建议设定成</span> <span class="n">no</span><span class="err">!</span> +<span class="n">UserLogin</span> <span class="n">no</span><span class="err">       </span> <span class="err">#</span> <span class="err">在</span> <span class="n">SSH</span> <span class="err">底下本来就不接受</span> <span class="n">login</span> <span class="err">这个程序的登入!</span> +<span class="n">StrictModes</span> <span class="n">yes</span><span class="err">      #</span> <span class="err">当使用者的</span> <span class="n">host</span> <span class="n">key</span> <span class="err">改变之后,</span><span class="n">Server</span> <span class="err">就不接受联机,</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">可以抵挡部分的木马程序!</span> +<span class="cp">#RSAAuthentication yes   # 是否使用纯的 RSA 认证!?仅针对 version 1 !</span> +<span class="n">PubkeyAuthentication</span> <span class="n">yes</span><span class="err"> </span> <span class="err">#</span> <span class="err">是否允许</span> <span class="n">Public</span> <span class="n">Key</span> <span class="err">?当然允许啦!只有</span> <span class="n">version</span> <span class="mi">2</span> +<span class="n">AuthorizedKeysFile</span> <span class="p">.</span><span class="n">ssh</span><span class="o">/</span><span class="n">authorized_keys</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">上面这个在设定若要使用不需要密码登入的账号时,那么那个</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">账号的存放档案所在档名!</span> +<span class="cp"># 4.2 认证部分</span> +<span class="n">RhostsAuthentication</span> <span class="n">no</span><span class="err">  #</span> <span class="err">本机系统不止使用</span> <span class="p">.</span><span class="n">rhosts</span> <span class="err">,因为仅使用</span> <span class="p">.</span><span class="n">rhosts</span> <span class="err">太</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">不安全了,所以这里一定要设定为</span> <span class="n">no</span> <span class="err">!</span> +<span class="n">IgnoreRhosts</span> <span class="n">yes</span><span class="err">     </span> <span class="err">#</span> <span class="err">是否取消使用</span> <span class="o">~/</span><span class="p">.</span><span class="n">ssh</span><span class="o">/</span><span class="p">.</span><span class="n">rhosts</span> <span class="err">来做为认证!当然是!</span> +<span class="n">RhostsRSAAuthentication</span> <span class="n">no</span> <span class="err">#</span> <span class="err">这个选项是专门给</span> <span class="n">version</span> <span class="mi">1</span> <span class="err">用的,使用</span> <span class="n">rhosts</span> <span class="err">档案在</span> +<span class="err">             </span> <span class="err">#</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">hosts</span><span class="p">.</span><span class="n">equiv</span><span class="err">配合</span> <span class="n">RSA</span> <span class="err">演算方式来进行认证!不要使用</span> +<span class="n">HostbasedAuthentication</span> <span class="n">no</span> <span class="err">#</span> <span class="err">这个项目与上面的项目类似,不过是给</span> <span class="n">version</span> <span class="mi">2</span> <span class="err">使用的!</span> +<span class="n">IgnoreUserKnownHosts</span> <span class="n">no</span><span class="err">  #</span> <span class="err">是否忽略家目录内的</span> <span class="o">~/</span><span class="p">.</span><span class="n">ssh</span><span class="o">/</span><span class="n">known_hosts</span> <span class="err">这个档案所记录</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">的主机内容?当然不要忽略,所以这里就是</span> <span class="n">no</span> <span class="err">啦!</span> +<span class="n">PasswordAuthentication</span> <span class="n">yes</span> <span class="err">#</span> <span class="err">密码验证当然是需要的!所以这里写</span> <span class="n">yes</span> <span class="err">啰!</span> +<span class="n">PermitEmptyPasswords</span> <span class="n">no</span><span class="err">  #</span> <span class="err">若上面那一项如果设定为</span> <span class="n">yes</span> <span class="err">的话,这一项就最好设定</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">为</span> <span class="n">no</span> <span class="err">,这个项目在是否允许以空的密码登入!当然不许!</span> +<span class="n">ChallengeResponseAuthentication</span> <span class="n">yes</span> <span class="err">#</span> <span class="err">挑战任何的密码认证!所以,任何</span> <span class="n">login</span><span class="p">.</span><span class="n">conf</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">规定的认证方式,均可适用!</span> +<span class="cp">#PAMAuthenticationViaKbdInt yes # 是否启用其它的 PAM 模块!启用这个模块将会</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">导致</span> <span class="n">PasswordAuthentication</span> <span class="err">设定失效!</span> +<span class="err"> </span> +<span class="cp"># 4.3 与 Kerberos 有关的参数设定!因为我们没有 Kerberos 主机,所以底下不用设定!</span> +<span class="cp">#KerberosAuthentication no</span> +<span class="cp">#KerberosOrLocalPasswd yes</span> +<span class="cp">#KerberosTicketCleanup yes</span> +<span class="cp">#KerberosTgtPassing no</span> +<span class="err"> </span> +<span class="cp"># 4.4 底下是有关在 X-Window 底下使用的相关设定!</span> +<span class="n">X11Forwarding</span> <span class="n">yes</span> +<span class="cp">#X11DisplayOffset 10</span> +<span class="cp">#X11UseLocalhost yes</span> +<span class="cp"># 4.5 登入后的项目:</span> +<span class="n">PrintMotd</span> <span class="n">no</span> <span class="err">#</span> <span class="err">登入后是否显示出一些信息呢?例如上次登入的时间、地点等</span> +<span class="err">             #</span> <span class="err">等,预设是</span> <span class="n">yes</span> <span class="err">,但是,如果为了安全,可以考虑改为</span> <span class="n">no</span> <span class="err">!</span> +<span class="n">PrintLastLog</span> <span class="n">yes</span><span class="err">     #</span> <span class="err">显示上次登入的信息!可以啊!预设也是</span> <span class="n">yes</span> <span class="err">!</span> +<span class="n">KeepAlive</span> <span class="n">yes</span><span class="err">      </span> <span class="err">#</span> <span class="err">一般而言,如果设定这项目的话,那么</span> <span class="n">SSH</span> <span class="n">Server</span> <span class="err">会传送</span> +<span class="err">             #</span> <span class="n">KeepAlive</span> <span class="err">的讯息给</span> <span class="n">Client</span> <span class="err">端,以确保两者的联机正常!</span> +<span class="err">             #</span> <span class="err">在这个情况下,任何一端死掉后,</span> <span class="n">SSH</span> <span class="err">可以立刻知道!而不会</span> +<span class="err">             #</span> <span class="err">有僵尸程序的发生!</span> +<span class="n">UsePrivilegeSeparation</span> <span class="n">yes</span> <span class="err">#</span> <span class="err">使用者的权限设定项目!就设定为</span> <span class="n">yes</span> <span class="err">吧!</span> +<span class="n">MaxStartups</span> <span class="mi">10</span><span class="err">      #</span> <span class="err">同时允许几个尚未登入的联机画面?当我们连上</span> <span class="n">SSH</span> <span class="err">,</span> +<span class="err">             #</span> <span class="err">但是尚未输入密码时,这个时候就是我们所谓的联机画面啦!</span> +<span class="err">             #</span> <span class="err">在这个联机画面中,为了保护主机,所以需要设定最大值,</span> +<span class="err">             #</span> <span class="err">预设最多十个联机画面,而已经建立联机的不计算在这十个当中</span> +<span class="cp"># 4.6 关于使用者抵挡的设定项目:</span> +<span class="n">DenyUsers</span> <span class="o">*</span><span class="err">       </span> <span class="err">#</span> <span class="err">设定受抵挡的使用者名称,如果是全部的使用者,那就是全部</span> +<span class="err">             #</span> <span class="err">挡吧!若是部分使用者,可以将该账号填入!例如下列!</span> +<span class="n">DenyUsers</span> <span class="n">test</span> +<span class="n">DenyGroups</span> <span class="n">test</span><span class="err">     </span> <span class="err">#</span> <span class="err">与</span> <span class="n">DenyUsers</span> <span class="err">相同!仅抵挡几个群组而已!</span> +<span class="cp"># 5. 关于 SFTP 服务的设定项目!</span> +<span class="n">Subsystem</span> <span class="n">sftp</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">ssh</span><span class="o">/</span><span class="n">sftp</span><span class="o">-</span><span class="n">server</span> +</pre></div> + + +<p>另外,如果您修改过上面这个档案(/etc/ssh/sshd_config),那么就必需要重新启动一次 sshd 这个 daemon 才行!亦即是:<br /> +<code>/etc/rc.d/init.d/sshd restart</code></p>SSH原理2013-12-08T00:00:00+08:00Wontag:wbowam.github.io,2013-12-08:sshyuan-li.html<p>简单说,SSH是一种网络协议,用于计算机之间的加密登录。</p> +<hr /> +<h3 id="_1">一 最基本的用法<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。 +<code>$ ssh user@host</code> +如果本地用户名与远程用户名一致,登录时可以省略用户名。 +<code>$ ssh host</code> +SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。 +<code>$ ssh -p 2222 user@host</code> +上面这条命令表示,ssh直接连接远程主机的2222端口。</p> +<h3 id="ssh">二 SSH原理<a class="headerlink" href="#ssh" title="Permanent link">&para;</a></h3> +<p>SSH之所以能够保证安全,原因在于它采用了公钥加密。<br /> +原理如图<img alt="ssh原理图" src="http://tulparblog.qiniudn.com/ssh.jpg" /> +SSH登录整个过程是这样的:<br /> +(1)远程主机收到用户的登录请求,把自己的公钥发给用户。<br /> +(2)用户使用这个公钥,将登录密码加密后,发送回来。<br /> +(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。</p> +<h3 id="_2">三 密码登录过程<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p>如果你是第一次登录对方主机,系统会出现下面的提示: </p> +<div class="highlight"><pre><span class="err"> $</span> <span class="n">ssh</span> <span class="n">user</span><span class="err">@</span><span class="n">host</span> +<span class="err">  </span><span class="n">The</span> <span class="n">authenticity</span> <span class="n">of</span> <span class="n">host</span> <span class="err">&#39;</span><span class="n">host</span> <span class="p">(</span><span class="mf">12.18.429.21</span><span class="p">)</span><span class="err">&#39;</span> <span class="n">can</span><span class="err">&#39;</span><span class="n">t</span> <span class="n">be</span> <span class="n">established</span><span class="p">.</span> +<span class="err">  </span><span class="n">RSA</span> <span class="n">key</span> <span class="n">fingerprint</span> <span class="n">is</span> <span class="mi">98</span><span class="o">:</span><span class="mi">2</span><span class="n">e</span><span class="o">:</span><span class="n">d7</span><span class="o">:</span><span class="n">e0</span><span class="o">:</span><span class="n">de</span><span class="o">:</span><span class="mf">9f</span><span class="o">:</span><span class="n">ac</span><span class="o">:</span><span class="mi">67</span><span class="o">:</span><span class="mi">28</span><span class="o">:</span><span class="n">c2</span><span class="o">:</span><span class="mi">42</span><span class="o">:</span><span class="mi">2</span><span class="n">d</span><span class="o">:</span><span class="mi">37</span><span class="o">:</span><span class="mi">16</span><span class="o">:</span><span class="mi">58</span><span class="o">:</span><span class="mi">4</span><span class="n">d</span><span class="p">.</span> +<span class="err">  </span><span class="n">Are</span> <span class="n">you</span> <span class="n">sure</span> <span class="n">you</span> <span class="n">want</span> <span class="n">to</span> <span class="k">continue</span> <span class="n">connecting</span> <span class="p">(</span><span class="n">yes</span><span class="o">/</span><span class="n">no</span><span class="p">)</span><span class="o">?</span> +</pre></div> + + +<p>这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗? +所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。<br /> +上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。 +很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。 <br /> +假定经过风险衡量以后,用户决定接受这个远程主机的公钥。 <br /> +<code>Are you sure you want to continue connecting (yes/no)? yes</code> <br /> +系统会出现一句提示,表示host主机已经得到认可。 <br /> +<code>Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.</code> +然后,会要求输入密码。 <br /> +<code>Password: (enter password)</code> <br /> +如果密码正确,就可以登录了。<br /> +当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。<br /> +每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。</p> +<h3 id="_3">四 公钥登录<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<p>使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。<br /> +所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。 </p> +<p>这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:<br /> +<code>$ ssh-keygen</code> <br /> +运行上面的命令以后,系统会出现一系列提示,可以一路回车。也可以慢慢看英文,如果你执意。。。 </p> +<p>运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。 </p> +<p>这时再输入下面的命令,将公钥传送到远程主机host上面:<br /> +<code>$ ssh-copy-id user@host</code><br /> +好了,从此你再登录,就不需要输入密码了。 </p> +<h5 id="etcsshsshd_config">如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面"#"注释是否取掉。<a class="headerlink" href="#etcsshsshd_config" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">RSAAuthentication</span> <span class="n">yes</span> +<span class="err">  </span><span class="n">PubkeyAuthentication</span> <span class="n">yes</span> +<span class="err">  </span><span class="n">AuthorizedKeysFile</span> <span class="p">.</span><span class="n">ssh</span><span class="o">/</span><span class="n">authorized_keys</span> +</pre></div> + + +<p>然后,重启远程主机的ssh服务。 </p> +<div class="highlight"><pre><span class="err">  </span><span class="c1">// ubuntu系统</span> +<span class="err">  </span><span class="n">service</span> <span class="n">ssh</span> <span class="n">restart</span> +<span class="err">  </span><span class="c1">// debian系统</span> +<span class="err">  </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">init</span><span class="p">.</span><span class="n">d</span><span class="o">/</span><span class="n">ssh</span> <span class="n">restart</span> +</pre></div> + + +<hr /> +<h3 id="_4">五 绑定本地端口<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<p>既然SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性。 </p> +<p>假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就这样写:<br /> +<code>$ ssh -D 8080 user@host</code> </p> +<p>SSH会建立一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。可以想象,如果8080端口原来是一个不加密端口,现在将变成一个加密端口。 </p> +<h3 id="_5">本地端口转发<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3> +<p>有时,绑定本地端口还不够,还必须指定数据传送的目标主机,从而形成点对点的"端口转发"。为了区别后文的"远程端口转发",我们把这种情况称为"本地端口转发"(Local forwarding)。 </p> +<p>假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过host3,将host1连上host2。 </p> +<p>我们在host1执行下面的命令: </p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">ssh</span> <span class="o">-</span><span class="n">L</span> <span class="mi">2121</span><span class="o">:</span><span class="n">host2</span><span class="o">:</span><span class="mi">21</span> <span class="n">host3</span> +</pre></div> + + +<p>命令中的L参数一共接受三个值,分别是"本地端口:目标主机:目标主机端口",它们之间用冒号分隔。这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)。 </p> +<p>这样一来,我们只要连接host1的2121端口,就等于连上了host2的21端口。</p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">ftp</span> <span class="n">localhost</span><span class="o">:</span><span class="mi">2121</span> +</pre></div> + + +<p>"本地端口转发"使得host1和host3之间仿佛形成一个数据传输的秘密隧道,因此又被称为"SSH隧道"。 </p> +<h3 id="_6">六 远程端口转发<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3> +<p>既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发。 </p> +<p>还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,"本地端口转发"就不能用了,怎么办? </p> +<p>解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。 </p> +<p>我们在host3执行下面的命令:<br /> +<code>$ ssh -R 2121:host2:21 host1</code> <br /> +R参数也是接受三个值,分别是"远程主机端口:目标主机:目标主机端口"。这条命令的意思,就是让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为"远程端口绑定"。 </p> +<p>绑定之后,我们在host1就可以连接host2了: <br /> +<code>$ ftp localhost:2121</code> <br /> +这里必须指出,"远程端口转发"的前提条件是,host1和host3两台主机都有sshD和ssh客户端。</p>Tmux 入门2013-12-08T00:00:00+08:00Wontag:wbowam.github.io,2013-12-08:tmux-ru-men.html<h3 id="tmux">tmux快捷键<a class="headerlink" href="#tmux" title="Permanent link">&para;</a></h3> +<p>tmux在会话中使用大量的快捷键来控制多个窗口、多个会话等。</p> +<div class="highlight"><pre><span class="n">Ctrl</span><span class="o">+</span><span class="n">b</span> <span class="c1">// 激活控制台;此时以下按键生效 </span> +<span class="err">系统操作</span> + <span class="o">?</span> <span class="c1">// 列出所有快捷键;按q返回 </span> + <span class="n">d</span> <span class="c1">// 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 </span> + <span class="n">D</span> <span class="c1">// 选择要脱离的会话;在同时开启了多个会话时使用 </span> + <span class="n">Ctrl</span><span class="o">+</span><span class="n">z</span> <span class="c1">// 挂起当前会话 </span> + <span class="n">r</span> <span class="c1">// 强制重绘未脱离的会话 </span> + <span class="n">s</span> <span class="c1">// 选择并切换会话;在同时开启了多个会话时使用 </span> + <span class="o">:</span> <span class="c1">// 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器 </span> + <span class="p">[</span> <span class="c1">// 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出 </span> + <span class="o">~</span> <span class="c1">// 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息 </span> +<span class="err">窗口操作</span> + <span class="n">c</span> <span class="c1">// 创建新窗口 </span> + <span class="o">&amp;</span> <span class="c1">// 关闭当前窗口 </span> + <span class="err">数字键</span> <span class="c1">// 切换至指定窗口 </span> + <span class="n">p</span> <span class="c1">// 切换至上一窗口 </span> + <span class="n">n</span> <span class="c1">// 切换至下一窗口 </span> + <span class="n">l</span> <span class="c1">// 在前后两个窗口间互相切换 </span> + <span class="n">w</span> <span class="c1">// 通过窗口列表切换窗口 </span> + <span class="p">,</span> <span class="c1">// 重命名当前窗口;这样便于识别 </span> + <span class="p">.</span> <span class="c1">// 修改当前窗口编号;相当于窗口重新排序 </span> + <span class="n">f</span> <span class="c1">// 在所有窗口中查找指定文本 </span> +<span class="err">面板操作</span> + <span class="err">”</span> <span class="c1">// 将当前面板平分为上下两块 </span> + <span class="o">%</span> <span class="c1">// 将当前面板平分为左右两块 </span> + <span class="n">x</span> <span class="c1">// 关闭当前面板 </span> + <span class="o">!</span> <span class="c1">// 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板 </span> + <span class="n">Ctrl</span><span class="o">+</span><span class="err">方向键</span> <span class="c1">// 以1个单元格为单位移动边缘以调整当前面板大小 </span> + <span class="n">Alt</span><span class="o">+</span><span class="err">方向键</span> <span class="c1">// 以5个单元格为单位移动边缘以调整当前面板大小 </span> + <span class="n">Space</span> <span class="c1">// 在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled </span> + <span class="n">q</span> <span class="c1">// 显示面板编号 </span> + <span class="n">o</span> <span class="c1">// 在当前窗口中选择下一面板 </span> + <span class="err">方向键</span> <span class="c1">// 移动光标以选择面板 </span> + <span class="p">{</span> <span class="c1">// 向前置换当前面板 </span> + <span class="p">}</span> <span class="c1">// 向后置换当前面板 </span> + <span class="n">Alt</span><span class="o">+</span><span class="n">o</span> <span class="c1">// 逆时针旋转当前窗口的面板 </span> + <span class="n">Ctrl</span><span class="o">+</span><span class="n">o</span> <span class="c1">// 顺时针旋转当前窗口的面板 </span> +</pre></div> + + +<h3 id="_1">主要快捷键<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>-- 基本使用</p> +<div class="highlight"><pre><span class="n">tmux</span> <span class="c1">//运行C-b d //返回主 shell , tmux 依旧在后台运行,里面的命令也保持运行状态tmux attach //恢复tmux</span> +<span class="o">--</span> <span class="err">快捷键</span> +<span class="n">tmux</span> <span class="err">的使用主要就是依靠快捷键,通过</span> <span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="err">来调用。</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="o">?</span> <span class="c1">// 显示快捷键帮助</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">C</span><span class="o">-</span><span class="n">o</span> <span class="c1">//调换窗口位置</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="err">空格键</span> <span class="c1">//采用下一个内置布局</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="o">!</span> <span class="c1">// 把当前窗口变为新窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="s">&quot; // 模向分隔窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="o">%</span> <span class="c1">// 纵向分隔窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">q</span> <span class="c1">// 显示分隔窗口的编号</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">o</span> <span class="c1">// 跳到下一个分隔窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="err">上下键</span> <span class="c1">// 上一个及下一个分隔窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">C</span><span class="o">-</span><span class="err">方向键</span> <span class="c1">//调整分隔窗口大小</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="o">&amp;</span> <span class="c1">// 确认后退出 tmux</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">c</span> <span class="c1">// 创建新窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="err">,</span><span class="c1">//修改当前窗口名称</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="mi">0</span><span class="o">~</span><span class="mi">9</span> <span class="c1">//选择几号窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">c</span> <span class="c1">// 创建新窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">n</span> <span class="c1">// 选择下一个窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">l</span> <span class="c1">// 最后使用的窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">p</span> <span class="c1">// 选择前一个窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">w</span> <span class="c1">// 以菜单方式显示及选择窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">s</span> <span class="c1">// 以菜单方式显示和选择会话</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">t</span> <span class="c1">//显示时钟</span> +</pre></div> + + +<h3 id="_2">配置文件<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p>tmux配置文件在~/.tmux.conf和/etc/tmux.conf中,配置文件中可以修改默认绑定的快捷键</p> +<p>配置文件示例:</p> +<div class="highlight"><pre><span class="c1">// 此类配置可以在命令行模式中输入show-options -g查询 </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">base</span><span class="o">-</span><span class="n">index</span> <span class="mh">1</span> <span class="c1">// 窗口的初始序号;默认为0,这里设置为1 </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">display</span><span class="o">-</span><span class="k">time</span> <span class="mh">5000</span> <span class="c1">// 提示信息的持续时间;设置足够的时间以避免看不清提示,单位为毫秒 </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="k">repeat</span><span class="o">-</span><span class="k">time</span> <span class="mh">1000</span> <span class="c1">// 控制台激活后的持续时间;设置合适的时间以避免每次操作都要先激活控制台,单位为毫秒 </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">status</span><span class="o">-</span><span class="n">keys</span> <span class="n">vi</span> <span class="c1">// 操作状态栏时的默认键盘布局;可以设置为vi或emacs </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">status</span><span class="o">-</span><span class="n">right</span> <span class="s">&quot;#(date +%H:%M&#39; &#39;)&quot;</span> <span class="c1">// 状态栏右方的内容;这里的设置将得到类似23:59的显示 </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">status</span><span class="o">-</span><span class="n">right</span><span class="o">-</span><span class="n">length</span> <span class="mh">10</span> <span class="c1">// 状态栏右方的内容长度;建议把更多的空间留给状态栏左方(用于列出当前窗口) </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">status</span><span class="o">-</span><span class="n">utf8</span> <span class="n">on</span> <span class="c1">// 开启状态栏的UTF-8支持 </span> + +<span class="c1">// 此类设置可以在命令行模式中输入show-window-options -g查询 </span> +<span class="n">set</span><span class="o">-</span><span class="n">window</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">mode</span><span class="o">-</span><span class="n">keys</span> <span class="n">vi</span> <span class="c1">// 复制模式中的默认键盘布局;可以设置为vi或emacs </span> +<span class="n">set</span><span class="o">-</span><span class="n">window</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">utf8</span> <span class="n">on</span> <span class="c1">// 开启窗口的UTF-8支持 </span> + +<span class="c1">// 将激活控制台的快捷键由Ctrl+b修改为Ctrl+a,Ctrl+a是Screen的快捷键</span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">prefix</span> <span class="no">C</span><span class="o">-</span><span class="n">a</span> +<span class="n">unbind</span><span class="o">-</span><span class="n">key</span> <span class="no">C</span><span class="o">-</span><span class="n">b</span> +<span class="k">bind</span><span class="o">-</span><span class="n">key</span> <span class="no">C</span><span class="o">-</span><span class="n">a</span> <span class="n">send</span><span class="o">-</span><span class="n">prefix</span> + +<span class="c1">// 添加自定义快捷键 </span> +<span class="k">bind</span><span class="o">-</span><span class="n">key</span> <span class="n">z</span> <span class="n">kill</span><span class="o">-</span><span class="n">session</span> <span class="c1">// 按z结束当前会话;相当于进入命令行模式后输入kill-session </span> +<span class="k">bind</span><span class="o">-</span><span class="n">key</span> <span class="n">h</span> <span class="n">select</span><span class="o">-</span><span class="n">layout</span> <span class="n">even</span><span class="o">-</span><span class="n">horizontal</span> <span class="c1">// 按h将当前面板布局切换为even-horizontal;相当于进入命令行模式后输入select-layout even-horizontal </span> +<span class="k">bind</span><span class="o">-</span><span class="n">key</span> <span class="n">v</span> <span class="n">select</span><span class="o">-</span><span class="n">layout</span> <span class="n">even</span><span class="o">-</span><span class="n">vertical</span> <span class="c1">// 按v将当前面板布局切换为even-vertical;相当于进入命令行模式后输入select-layout even-vertical </span> +</pre></div>Github上搭博客2013-11-08T00:00:00+08:00Wontag:wbowam.github.io,2013-11-08:githubshang-da-bo-ke.html<p>Github上搭博客</p> +<hr /> +<h3 id="1">1.过程概要<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<ul> +<li>在Github上创建工程</li> +<li>安装配置pelican和git,以及准备工作</li> +<li>开始写博客</li> +</ul> +<h3 id="2">2.详细步骤<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<h3 id="github">在GitHub上创建工程<a class="headerlink" href="#github" title="Permanent link">&para;</a></h3> +<p>注册,配置github的过程略过</p> +<h5 id="tulpar008githubcomtulpar008">创建一个tulpar008.github.com的库(tulpar008是用户名必须是用户名)<a class="headerlink" href="#tulpar008githubcomtulpar008" title="Permanent link">&para;</a></h5> +<h5 id="pelican">安装配置pelican,以及准备工作<a class="headerlink" href="#pelican" title="Permanent link">&para;</a></h5> +<h4 id="pelican_1">pelican的安装<a class="headerlink" href="#pelican_1" title="Permanent link">&para;</a></h4> +<p><code>sudo pip install pelican</code> </p> +<h4 id="blogblog">电脑上创建一个blog目录,用来存放你的博客文件(我这里目录名直接用的“blog”)<a class="headerlink" href="#blogblog" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">mkdir</span> <span class="n">blog</span> +<span class="n">cd</span> <span class="n">blog</span> +<span class="n">pelican</span><span class="o">-</span><span class="n">quickstart</span> +</pre></div> + + +<p>这个时候你会看到blog目录下多了几个Pelican生成的文件,其中的pelicanconf.py就是配置文件</p> +<h3 id="_1">开始写博客<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>现在,就可以用Pelican开始写博客了,具体怎么写可参看Pelican的文档,这里我用Markdown举例。</p> +<h4 id="contentmd">进入content目录,用编辑器创建一个文件,写入博客内容并保存为md文件:<a class="headerlink" href="#contentmd" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">Date</span><span class="o">:</span> <span class="mi">2013</span><span class="o">-</span><span class="mi">06</span><span class="o">-</span><span class="mi">06</span> <span class="err">#日期</span> +<span class="n">Title</span><span class="o">:</span> <span class="n">My</span> <span class="n">Super</span> <span class="n">Beginng</span> <span class="err">#标题</span> +<span class="n">Tags</span><span class="o">:</span> <span class="n">Writing</span><span class="o">,</span> <span class="n">Life</span> <span class="err">#标签</span> +<span class="n">Category</span><span class="o">:</span> <span class="n">Life</span> <span class="err">#分类</span> +<span class="err">文章内容</span> +</pre></div> + + +<h4 id="blogmdhtml">写好之后,回到blog目录,将md文件翻译成html静态页面:<a class="headerlink" href="#blogmdhtml" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">cd</span> <span class="p">..</span> +<span class="n">make</span> <span class="n">html</span> +</pre></div> + + +<h6 id="_2">你还可以用这条命令编译:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h6> +<p><code>pelican content</code></p> +<h4 id="contentgithub">进入content目录,内容上传至github<a class="headerlink" href="#contentgithub" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">cd</span> <span class="n">content</span> + +<span class="n">git</span> <span class="n">init</span> +<span class="n">git</span> <span class="n">add</span> <span class="p">.</span> +<span class="n">git</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s">&quot;first commit&quot;</span> +<span class="n">git</span> <span class="n">remote</span> <span class="n">add</span> <span class="n">origin</span> <span class="n">git</span><span class="err">@</span><span class="n">github</span><span class="p">.</span><span class="n">com</span><span class="o">:</span><span class="n">tulpar008</span><span class="o">/</span><span class="n">tulpar008</span><span class="p">.</span><span class="n">github</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="n">git</span> +<span class="n">git</span> <span class="n">push</span> <span class="o">-</span><span class="n">u</span> <span class="n">origin</span> <span class="n">master</span> +</pre></div> + + +<hr /> +<p>That's all 去访问你的博客吧,<a href="http://tulpar008.github.com">我的</a></p> +<hr /> +<h2 id="_3">后续:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h2> +<h3 id="_4">更换主题<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<h4 id="githubpelicanclone">把github上pelican的主题全都clone下来<a class="headerlink" href="#githubpelicanclone" title="Permanent link">&para;</a></h4> +<p><code>git clone git://github.com/getpelican/pelican-themes.git</code> <br /> +在里面找到一个你喜欢的主题,假如这个主题的目录是 ~/pelican-themes/bootstrap2 ,</p> +<h4 id="pelican-themes">使用pelican-themes安装这个主题<a class="headerlink" href="#pelican-themes" title="Permanent link">&para;</a></h4> +<p><code>sudo pelican-themes -i ~/pelican-themes/bootstrap2</code> </p> +<h6 id="pelican-themes_1">随后就可以用pelican-themes查看已安装的主题<a class="headerlink" href="#pelican-themes_1" title="Permanent link">&para;</a></h6> +<p><code>pelican-themes --list --verbose</code> </p> +<h4 id="pelicanconfpytheme">要在你的博客中使用安装好的主题,直接在pelicanconf.py文件中修改或者添加THEME项为想要的主题名,例如<a class="headerlink" href="#pelicanconfpytheme" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">THEME</span> <span class="o">=</span> <span class="s">&quot;bootstrap2&quot;</span> +</pre></div> + + +<h4 id="_5">然后执行<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4> +<p><code>make html</code></p>linux 小技巧(1)2013-11-08T00:00:00+08:00Wontag:wbowam.github.io,2013-11-08:linux-xiao-ji-qiao-1.html<h3 id="1install-local-deb-packages">1.install local deb packages:<a class="headerlink" href="#1install-local-deb-packages" title="Permanent link">&para;</a></h3> +<p><code>dpkg -i file.deb</code></p> +<h5 id="uninstall-packages-installed-with-dpkg">uninstall packages installed with dpkg:<a class="headerlink" href="#uninstall-packages-installed-with-dpkg" title="Permanent link">&para;</a></h5> +<p><code>``dpkg -r appname</code></p> +<h5 id="list-packages-installed-with-dpkg">list packages installed with dpkg:<a class="headerlink" href="#list-packages-installed-with-dpkg" title="Permanent link">&para;</a></h5> +<p><code>dpkg --get-selections | grep -v deinstall</code></p>Shell脚本编程30分钟入门2013-11-08T00:00:00+08:00Wontag:wbowam.github.io,2013-11-08:shelljiao-ben-bian-cheng-30fen-zhong-ru-men.html<p>====================</p> +<h3 id="shell">什么是Shell脚本<a class="headerlink" href="#shell" title="Permanent link">&para;</a></h3> +<h4 id="_1">示例<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<p>看个例子吧:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4 +5 +6 +7 +8</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/sh</span> +<span class="nb">cd</span> ~ +mkdir shell_tut +<span class="nb">cd </span>shell_tut + +<span class="k">for</span> <span class="o">((</span><span class="nv">i</span><span class="o">=</span>0; i&lt;10; i++<span class="o">))</span>; <span class="k">do</span> +<span class="k"> </span>touch test_<span class="nv">$i</span>.txt +<span class="k">done</span> +</pre></div> +</td></tr></table> + +<h4 id="_2">示例解释<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<ul> +<li>第1行:指定脚本解释器,这里是用/bin/sh做解释器的</li> +<li>第2行:切换到当前用户的home目录</li> +<li>第3行:创建一个目录shell_tut</li> +<li>第4行:切换到shell_tut目录</li> +<li>第5行:循环条件,一共循环10次</li> +<li>第6行:创建一个test_1…10.txt文件</li> +<li>第7行:循环体结束</li> +</ul> +<p>cd, mkdir, touch都是系统自带的程序,一般在/bin或者/usr/bin目录下。for, do, done是sh脚本语言的关键字。</p> +<h4 id="shellshell">shell和shell脚本的概念<a class="headerlink" href="#shellshell" title="Permanent link">&para;</a></h4> +<p>shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。</p> +<p>shell脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。由于习惯的原因,简洁起见,本文出现的“shell编程”都是指shell脚本编程,不是指开发shell自身(如Windows Explorer扩展开发)。</p> +<h3 id="_3">环境<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<p>shell编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。</p> +<h4 id="os">OS<a class="headerlink" href="#os" title="Permanent link">&para;</a></h4> +<p>当前主流的操作系统都支持shell编程,本文档所述的shell编程是指Linux下的shell,讲的基本都是POSIX标准下的功能,所以,也适用于Unix及BSD(如Mac OS)。</p> +<h4 id="linux">Linux<a class="headerlink" href="#linux" title="Permanent link">&para;</a></h4> +<p>Linux默认安装就带了shell解释器。</p> +<h4 id="mac-os">Mac OS<a class="headerlink" href="#mac-os" title="Permanent link">&para;</a></h4> +<p>Mac OS不仅带了sh、bash这两个最基础的解释器,还内置了ksh、csh、zsh等不常用的解释器。</p> +<h4 id="windows">Windows上的模拟器<a class="headerlink" href="#windows" title="Permanent link">&para;</a></h4> +<p>windows出厂时没有内置shell解释器,需要自行安装,为了同时能用grep, awk, curl等工具,最好装一个cygwin或者mingw来模拟linux环境。</p> +<ul> +<li><a href="www.cygwin.com">cygwin</a></li> +<li><a href="www.mingw.org">mingw</a></li> +</ul> +<h3 id="_4">脚本解释器<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<h4 id="sh">sh<a class="headerlink" href="#sh" title="Permanent link">&para;</a></h4> +<p>即Bourne shell,POSIX(Portable Operating System Interface)标准的shell解释器,它的二进制文件路径通常是/bin/sh,由Bell Labs开发。</p> +<p>本文讲的是sh,如果你使用其它语言用作shell编程,请自行参考相应语言的文档。</p> +<h4 id="bash">bash<a class="headerlink" href="#bash" title="Permanent link">&para;</a></h4> +<p>Bash是Bourne shell的替代品,属GNU Project,二进制文件路径通常是/bin/bash。业界通常混用bash、sh、和shell,比如你会经常在招聘运维工程师的文案中见到:熟悉Linux Bash编程,精通Shell编程。</p> +<p>在CentOS里,/bin/sh是一个指向/bin/bash的符号链接:</p> +<div class="highlight"><pre><span class="p">[</span><span class="n">root</span><span class="err">@</span><span class="n">centosraw</span> <span class="o">~</span><span class="p">]</span><span class="err">#</span> <span class="n">ls</span> <span class="o">-</span><span class="n">l</span> <span class="o">/</span><span class="n">bin</span><span class="o">/*</span><span class="n">sh</span> +<span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="p">.</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">root</span> <span class="mi">903272</span> <span class="n">Feb</span> <span class="mi">22</span> <span class="mo">05</span><span class="o">:</span><span class="mi">09</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">bash</span> +<span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="p">.</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">root</span> <span class="mi">106216</span> <span class="n">Oct</span> <span class="mi">17</span> <span class="mi">2012</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">dash</span> +<span class="n">lrwxrwxrwx</span><span class="p">.</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">root</span> <span class="mi">4</span> <span class="n">Mar</span> <span class="mi">22</span> <span class="mi">10</span><span class="o">:</span><span class="mi">22</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span> <span class="o">-&gt;</span> <span class="n">bash</span> +</pre></div> + + +<p>但在Mac OS上不是,/bin/sh和/bin/bash是两个不同的文件,尽管它们的大小只相差100字节左右:</p> +<div class="highlight"><pre><span class="nl">iMac:</span><span class="o">~</span> <span class="n">wuxiao</span><span class="err">$</span> <span class="n">ls</span> <span class="o">-</span><span class="n">l</span> <span class="o">/</span><span class="n">bin</span><span class="o">/*</span><span class="n">sh</span> +<span class="o">-</span><span class="n">r</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">1371648</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">bash</span> +<span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">2</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">772992</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">csh</span> +<span class="o">-</span><span class="n">r</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">2180736</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">ksh</span> +<span class="o">-</span><span class="n">r</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">1371712</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span> +<span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">2</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">772992</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">tcsh</span> +<span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">1103984</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">zsh</span> +</pre></div> + + +<h4 id="_5">高级编程语言<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4> +<p>理论上讲,只要一门语言提供了解释器(而不仅是编译器),这门语言就可以胜任脚本编程,常见的解释型语言都是可以用作脚本编程的,如:Perl、Tcl、Python、PHP、Ruby。Perl是最老牌的脚本编程语言了,Python这些年也成了一些linux发行版的预置解释器。</p> +<p>编译型语言,只要有解释器,也可以用作脚本编程,如C shell是内置的(/bin/csh),Java有第三方解释器Jshell,Ada有收费的解释器AdaScript。</p> +<p>如下是一个PHP Shell Script示例(假设文件名叫test.php):</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4</pre></div></td><td class="code"><div class="highlight"><pre><span class="x">#!/usr/bin/php</span> +<span class="cp">&lt;?php</span> +<span class="k">for</span> <span class="p">(</span><span class="nv">$i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nv">$i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nv">$i</span><span class="o">++</span><span class="p">)</span> + <span class="k">echo</span> <span class="nv">$i</span> <span class="o">.</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">;</span> +</pre></div> +</td></tr></table> + +<p>执行:</p> +<div class="highlight"><pre><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">php</span> <span class="n">test</span><span class="p">.</span><span class="n">php</span> +<span class="err">或者:</span> +<span class="n">chmod</span> <span class="o">+</span><span class="n">x</span> <span class="n">test</span><span class="p">.</span><span class="n">php</span> +<span class="p">.</span><span class="o">/</span><span class="n">test</span><span class="p">.</span><span class="n">php</span> +</pre></div> + + +<h2 id="shell_1">如何选择shell编程语言<a class="headerlink" href="#shell_1" title="Permanent link">&para;</a></h2> +<h3 id="vs">熟悉 vs 陌生<a class="headerlink" href="#vs" title="Permanent link">&para;</a></h3> +<p>如果你已经掌握了一门编程语言(如PHP、Python、Java、JavaScript),建议你就直接使用这门语言编写脚本程序,虽然某些地方会有点啰嗦,但你能利用在这门语言领域里的经验(单元测试、单步调试、IDE、第三方类库)。</p> +<p>新增的学习成本很小,只要学会怎么使用shell解释器(Jshell、AdaScript)就可以了。</p> +<h3 id="vs_1">简单 vs 高级<a class="headerlink" href="#vs_1" title="Permanent link">&para;</a></h3> +<p>如果你觉得自己熟悉的语言(如Java、C)写shell脚本实在太啰嗦,你只是想做一些备份文件、安装软件、下载数据之类的事情,学着使用sh,bash会是一个好主意。</p> +<p>shell只定义了一个非常简单的编程语言,所以,如果你的脚本程序复杂度较高,或者要操作的数据结构比较复杂,那么还是应该使用Python、Perl这样的脚本语言,或者是你本来就已经很擅长的高级语言。因为sh和bash在这方面很弱,比如说:</p> +<ul> +<li>它的函数只能返回字串,无法返回数组</li> +<li>它不支持面向对象,你无法实现一些优雅的设计模式</li> +<li>它是解释型的,一边解释一边执行,连PHP那种预编译都不是,如果你的脚本包含错误(例如调用了不存在的函数),只要没执行到这一行,就不会报错</li> +</ul> +<h3 id="_6">环境兼容性<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3> +<p>如果你的脚本是提供给别的用户使用,使用sh或者bash,你的脚本将具有最好的环境兼容性,perl很早就是linux标配了,python这些年也成了一些linux发行版的标配,至于mac os,它默认安装了perl、python、ruby、php、java等主流编程语言。</p> +<h2 id="shell_2">第一个shell脚本<a class="headerlink" href="#shell_2" title="Permanent link">&para;</a></h2> +<h3 id="_7">编写<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h3> +<p>打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。</p> +<p>输入一些代码,第一行一般是这样:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/bash</span> +<span class="c">#!/usr/bin/php</span> +</pre></div> +</td></tr></table> + +<p>“#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。</p> +<h3 id="_8">运行<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h3> +<p>运行Shell脚本有两种方法:</p> +<h4 id="_9">作为可执行程序<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">chmod</span> <span class="o">+</span><span class="n">x</span> <span class="n">test</span><span class="p">.</span><span class="n">sh</span> +<span class="p">.</span><span class="o">/</span><span class="n">test</span><span class="p">.</span><span class="n">sh</span> +</pre></div> + + +<p>注意,一定要写成./test.sh,而不是test.sh,运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。</p> +<p>通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。</p> +<p>这里的"系统",其实就是shell这个应用程序(想象一下Windows Explorer),但我故意写成系统,是方便理解,既然这个系统就是指shell,那么一个使用/bin/sh作为解释器的脚本是不是可以省去第一行呢?是的。</p> +<h4 id="_10">作为解释器参数<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h4> +<p>这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:</p> +<div class="highlight"><pre><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span> <span class="n">test</span><span class="p">.</span><span class="n">sh</span> +<span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">php</span> <span class="n">test</span><span class="p">.</span><span class="n">php</span> +</pre></div> + + +<p>这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。</p> +<h2 id="_11">变量<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h2> +<h3 id="_12">定义变量<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h3> +<p>定义变量时,变量名不加美元符号($),如:</p> +<div class="highlight"><pre><span class="n">your_name</span><span class="o">=</span><span class="s">&quot;qinjx&quot;</span> +</pre></div> + + +<p>注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。</p> +<p>除了显式地直接赋值,还可以用语句给变量赋值,如:</p> +<div class="highlight"><pre><span class="k">for</span> <span class="n">file</span> <span class="n">in</span> <span class="err">`</span><span class="n">ls</span> <span class="o">/</span><span class="n">etc</span><span class="err">`</span> +</pre></div> + + +<h3 id="_13">使用变量<a class="headerlink" href="#_13" title="Permanent link">&para;</a></h3> +<p>使用一个定义过的变量,只要在变量名前面加美元符号即可,如:</p> +<div class="highlight"><pre>your_name=&quot;qinjx&quot; +echo <span class="nv">$your_name</span> +echo <span class="cp">${</span><span class="n">your_name</span><span class="cp">}</span> +</pre></div> + + +<p>变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:</p> +<div class="highlight"><pre>for skill in Ada Coffe Action Java do + echo &quot;I am good at <span class="cp">${</span><span class="n">skill</span><span class="cp">}</span>Script&quot; +done +</pre></div> + + +<p>如果不给skill变量加花括号,写成echo "I am good at <span class="math">\(skillScript",解释器就会把\)</span>skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。</p> +<p>推荐给所有变量加上花括号,这是个好的编程习惯。IntelliJ IDEA编写shell script时,IDE就会提示加花括号。</p> +<h3 id="_14">重定义变量<a class="headerlink" href="#_14" title="Permanent link">&para;</a></h3> +<p>已定义的变量,可以被重新定义,如:</p> +<div class="highlight"><pre><span class="n">your_name</span><span class="o">=</span><span class="s">&quot;qinjx&quot;</span> +<span class="n">echo</span> <span class="err">$</span><span class="n">your_name</span> + +<span class="n">your_name</span><span class="o">=</span><span class="s">&quot;alibaba&quot;</span> +<span class="n">echo</span> <span class="err">$</span><span class="n">your_name</span> +</pre></div> + + +<p>这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符。</p> +<h2 id="_15">注释<a class="headerlink" href="#_15" title="Permanent link">&para;</a></h2> +<p>以“#”开头的行就是注释,会被解释器忽略。</p> +<h3 id="_16">多行注释<a class="headerlink" href="#_16" title="Permanent link">&para;</a></h3> +<p>sh里没有多行注释,只能每一行加一个#号。就像这样:</p> +<div class="highlight"><pre><span class="c">#--------------------------------------------</span> +<span class="c"># 这是一个自动打ipa的脚本,基于webfrogs的ipa-build书写:https://github.com/webfrogs/xcode_shell/blob/master/ipa-build</span> + +<span class="c"># 功能:自动为etao ios app打包,产出物为14个渠道的ipa包</span> +<span class="c"># 特色:全自动打包,不需要输入任何参数</span> +<span class="c">#--------------------------------------------</span> + +<span class="c">##### 用户配置区 开始 #####</span> +<span class="c">#</span> +<span class="c">#</span> +<span class="c"># 项目根目录,推荐将此脚本放在项目的根目录,这里就不用改了</span> +<span class="c"># 应用名,确保和Xcode里Product下的target_name.app名字一致</span> +<span class="c">#</span> +<span class="c">##### 用户配置区 结束 #####</span> +</pre></div> + + +<p>如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。</p> +<h2 id="_17">字符串<a class="headerlink" href="#_17" title="Permanent link">&para;</a></h2> +<p>字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了,哈哈),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。</p> +<h3 id="_18">单引号<a class="headerlink" href="#_18" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">str</span><span class="o">=</span><span class="err">&#39;</span><span class="n">this</span> <span class="n">is</span> <span class="n">a</span> <span class="n">string</span><span class="err">&#39;</span> +</pre></div> + + +<p>单引号字符串的限制:</p> +<ul> +<li>单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的</li> +<li>单引号字串中不能出现单引号(对单引号使用转义符后也不行)</li> +</ul> +<h3 id="_19">双引号<a class="headerlink" href="#_19" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">your_name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">qinjx</span><span class="err">&#39;</span> +<span class="n">str</span><span class="o">=</span><span class="s">&quot;Hello, I know your are </span><span class="se">\&quot;</span><span class="s">$your_name</span><span class="se">\&quot;</span><span class="s">! </span><span class="se">\n</span><span class="s">&quot;</span> +</pre></div> + + +<ul> +<li>双引号里可以有变量</li> +<li>双引号里可以出现转义字符</li> +</ul> +<h3 id="_20">字符串操作<a class="headerlink" href="#_20" title="Permanent link">&para;</a></h3> +<h4 id="_21">拼接字符串<a class="headerlink" href="#_21" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre>your_name=&quot;qinjx&quot; +greeting=&quot;hello, &quot;<span class="nv">$your_name</span>&quot; !&quot; +greeting_1=&quot;hello, <span class="cp">${</span><span class="n">your_name</span><span class="cp">}</span> !&quot; + +echo <span class="nv">$greeting</span> <span class="nv">$greeting_1</span> +</pre></div> + + +<h4 id="_22">获取字符串长度:<a class="headerlink" href="#_22" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre>string=&quot;abcd&quot; +echo <span class="cp">${</span><span class="c">#string</span><span class="cp">}</span> #输出 4 +</pre></div> + + +<h4 id="_23">提取子字符串<a class="headerlink" href="#_23" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre>string=&quot;alibaba is a great company&quot; +echo <span class="cp">${</span><span class="n">string</span><span class="p">:</span><span class="mi">1</span><span class="p">:</span><span class="mi">4</span><span class="cp">}</span> //输出liba +</pre></div> + + +<h4 id="_24">查找子字符串<a class="headerlink" href="#_24" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">string</span><span class="o">=</span><span class="s">&quot;alibaba is a great company&quot;</span> +<span class="n">echo</span> <span class="err">`</span><span class="n">expr</span> <span class="n">index</span> <span class="s">&quot;$string&quot;</span> <span class="n">is</span><span class="err">`</span> +</pre></div> + + +<h4 id="_25">更多<a class="headerlink" href="#_25" title="Permanent link">&para;</a></h4> +<p>参见本文档末尾的参考资料中<a href="http://tldp.org/LDP/abs/html/string-manipulation.html">Advanced Bash-Scripting Guid Chapter 10.1</a></p> +<h2 id="_26">数组<a class="headerlink" href="#_26" title="Permanent link">&para;</a></h2> +<h2 id="_27">管道<a class="headerlink" href="#_27" title="Permanent link">&para;</a></h2> +<h2 id="_28">条件判断<a class="headerlink" href="#_28" title="Permanent link">&para;</a></h2> +<h2 id="_29">流程控制<a class="headerlink" href="#_29" title="Permanent link">&para;</a></h2> +<p>和Java、PHP等语言不一样,sh的流程控制不可为空,如:</p> +<div class="highlight"><pre><span class="cp">&lt;?php</span> +<span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s2">&quot;q&quot;</span><span class="p">]))</span> <span class="p">{</span> + <span class="nx">search</span><span class="p">(</span><span class="nx">q</span><span class="p">);</span> +<span class="p">}</span> +<span class="k">else</span> <span class="p">{</span> + <span class="c1">//do nothing</span> +<span class="p">}</span> +</pre></div> + + +<p>在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else,就像这样</p> +<h3 id="if-else">if else<a class="headerlink" href="#if-else" title="Permanent link">&para;</a></h3> +<h4 id="if">if<a class="headerlink" href="#if" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">if</span> <span class="n">condition</span> +<span class="n">then</span> + <span class="n">command1</span> + <span class="n">command2</span> + <span class="p">...</span> + <span class="n">commandN</span> +<span class="n">fi</span> +</pre></div> + + +<p>写成一行(适用于终端命令提示符):</p> +<div class="highlight"><pre><span class="k">if</span> <span class="err">`</span><span class="n">ps</span> <span class="o">-</span><span class="n">ef</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">ssh</span><span class="err">`</span><span class="p">;</span> <span class="n">then</span> <span class="n">echo</span> <span class="n">hello</span><span class="p">;</span> <span class="n">fi</span> +</pre></div> + + +<p>末尾的fi就是if倒过来拼写,后面还会遇到类似的</p> +<h4 id="if-else_1">if else<a class="headerlink" href="#if-else_1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">if</span> <span class="n">condition</span> +<span class="n">then</span> + <span class="n">command1</span> + <span class="n">command2</span> + <span class="p">...</span> + <span class="n">commandN</span> +<span class="k">else</span> + <span class="n">command</span> +<span class="n">fi</span> +</pre></div> + + +<h4 id="if-else-if-else">if else-if else<a class="headerlink" href="#if-else-if-else" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">if</span> <span class="n">condition1</span> +<span class="n">then</span> + <span class="n">command1</span> +<span class="n">elif</span> <span class="n">condition2</span> + <span class="n">command2</span> +<span class="k">else</span> + <span class="n">commandN</span> +<span class="n">fi</span> +</pre></div> + + +<h3 id="for-while">for while<a class="headerlink" href="#for-while" title="Permanent link">&para;</a></h3> +<h4 id="for">for<a class="headerlink" href="#for" title="Permanent link">&para;</a></h4> +<p>在开篇的示例里演示过了:</p> +<div class="highlight"><pre><span class="k">for</span> <span class="n">var</span> <span class="n">in</span> <span class="n">item1</span> <span class="n">item2</span> <span class="p">...</span> <span class="n">itemN</span> +<span class="k">do</span> + <span class="n">command1</span> + <span class="n">command2</span> + <span class="p">...</span> + <span class="n">commandN</span> +<span class="n">done</span> +</pre></div> + + +<p>写成一行:</p> +<div class="highlight"><pre><span class="k">for</span> <span class="n">var</span> <span class="n">in</span> <span class="n">item1</span> <span class="n">item2</span> <span class="p">...</span> <span class="n">itemN</span><span class="p">;</span> <span class="k">do</span> <span class="n">command1</span><span class="p">;</span> <span class="n">command2</span><span class="err">…</span> <span class="n">done</span><span class="p">;</span> +</pre></div> + + +<h4 id="cfor">C风格的for<a class="headerlink" href="#cfor" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">for</span> <span class="p">((</span> <span class="n">EXP1</span><span class="p">;</span> <span class="n">EXP2</span><span class="p">;</span> <span class="n">EXP3</span> <span class="p">))</span> +<span class="k">do</span> + <span class="n">command1</span> + <span class="n">command2</span> + <span class="n">command3</span> +<span class="n">done</span> +</pre></div> + + +<h4 id="while">while<a class="headerlink" href="#while" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">while</span> <span class="n">condition</span> +<span class="k">do</span> + <span class="n">command</span> +<span class="n">done</span> +</pre></div> + + +<h4 id="_30">无限循环<a class="headerlink" href="#_30" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">while</span> <span class="o">:</span> +<span class="k">do</span> + <span class="n">command</span> +<span class="n">done</span> +</pre></div> + + +<p>或者</p> +<div class="highlight"><pre><span class="k">while</span> <span class="nb">true</span> +<span class="k">do</span> + <span class="n">command</span> +<span class="n">done</span> +</pre></div> + + +<p>或者</p> +<div class="highlight"><pre><span class="k">for</span> <span class="p">((</span> <span class="p">;</span> <span class="p">;</span> <span class="p">))</span> +</pre></div> + + +<h4 id="until">until<a class="headerlink" href="#until" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">until</span> <span class="n">condition</span> +<span class="k">do</span> + <span class="n">command</span> +<span class="n">done</span> +</pre></div> + + +<h3 id="case">case<a class="headerlink" href="#case" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre>case &quot;<span class="cp">${</span><span class="n">opt</span><span class="cp">}</span>&quot; in + &quot;Install-Puppet-Server&quot; ) + install_master $1 + exit + ;; + + &quot;Install-Puppet-Client&quot; ) + install_client $1 + exit + ;; + + &quot;Config-Puppet-Server&quot; ) + config_puppet_master + exit + ;; + + &quot;Config-Puppet-Client&quot; ) + config_puppet_client + exit + ;; + + &quot;Exit&quot; ) + exit + ;; + + * ) echo &quot;Bad option, please choose again&quot; +esac +</pre></div> + + +<p>case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break</p> +<h2 id="_31">函数<a class="headerlink" href="#_31" title="Permanent link">&para;</a></h2> +<h3 id="_32">定义<a class="headerlink" href="#_32" title="Permanent link">&para;</a></h3> +<h3 id="_33">调用<a class="headerlink" href="#_33" title="Permanent link">&para;</a></h3> +<h2 id="_34">文件包含<a class="headerlink" href="#_34" title="Permanent link">&para;</a></h2> +<p>可以使用source和.关键字,如:</p> +<div class="highlight"><pre><span class="nx">source</span> <span class="p">.</span><span class="o">/</span><span class="kd">function</span><span class="p">.</span><span class="nx">sh</span> +<span class="p">.</span> <span class="p">.</span><span class="o">/</span><span class="kd">function</span><span class="p">.</span><span class="nx">sh</span> +</pre></div> + + +<p>在bash里,source和.是等效的,他们都是读入function.sh的内容并执行其内容(类似PHP里的include),为了更好的可移植性,推荐使用第二种写法。</p> +<h2 id="_35">用户输入<a class="headerlink" href="#_35" title="Permanent link">&para;</a></h2> +<h3 id="_36">执行脚本时传入<a class="headerlink" href="#_36" title="Permanent link">&para;</a></h3> +<h3 id="_37">脚本运行中输入<a class="headerlink" href="#_37" title="Permanent link">&para;</a></h3> +<h3 id="select">select菜单<a class="headerlink" href="#select" title="Permanent link">&para;</a></h3> +<h2 id="stdinstdout">stdin和stdout<a class="headerlink" href="#stdinstdout" title="Permanent link">&para;</a></h2> +<h2 id="_38">常用的命令<a class="headerlink" href="#_38" title="Permanent link">&para;</a></h2> +<p>sh脚本结合系统命令便有了强大的威力,在字符处理领域,有grep、awk、sed三剑客,grep负责找出特定的行,awk能将行拆分成多个字段,sed则可以实现更新插入删除等写操作。</p> +<h3 id="ps">ps<a class="headerlink" href="#ps" title="Permanent link">&para;</a></h3> +<p>查看进程列表</p> +<h3 id="grep">grep<a class="headerlink" href="#grep" title="Permanent link">&para;</a></h3> +<h4 id="grep_1">排除grep自身<a class="headerlink" href="#grep_1" title="Permanent link">&para;</a></h4> +<h4 id="target">查找与target相邻的结果<a class="headerlink" href="#target" title="Permanent link">&para;</a></h4> +<h3 id="awk">awk<a class="headerlink" href="#awk" title="Permanent link">&para;</a></h3> +<h3 id="sed">sed<a class="headerlink" href="#sed" title="Permanent link">&para;</a></h3> +<h4 id="_39">插入<a class="headerlink" href="#_39" title="Permanent link">&para;</a></h4> +<h4 id="_40">替换<a class="headerlink" href="#_40" title="Permanent link">&para;</a></h4> +<h4 id="_41">删除<a class="headerlink" href="#_41" title="Permanent link">&para;</a></h4> +<h3 id="xargs">xargs<a class="headerlink" href="#xargs" title="Permanent link">&para;</a></h3> +<h3 id="curl">curl<a class="headerlink" href="#curl" title="Permanent link">&para;</a></h3> +<h2 id="_42">综合案例<a class="headerlink" href="#_42" title="Permanent link">&para;</a></h2> +<h2 id="_43">参考资料<a class="headerlink" href="#_43" title="Permanent link">&para;</a></h2> +<ul> +<li><a href="http://tldp.org/LDP/abs/html/">Advanced Bash-Scripting Guide</a>,非常详细,非常易读,大量example,既可以当入门教材,也可以当做工具书查阅</li> +<li><a href="http://www.tutorialspoint.com/unix/unix-shell.htm">Unix Shell Programming</a></li> +<li><a href="http://bash.cyberciti.biz/guide/Main_Page">Linux Shell Scripting Tutorial - A Beginner's handbook</a></li> +</ul> +<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) { + var align = "center", + indent = "0em", + linebreak = "false"; + + if (false) { + align = (screen.width < 768) ? "left" : align; + indent = (screen.width < 768) ? "0em" : indent; + linebreak = (screen.width < 768) ? 'true' : linebreak; + } + + var mathjaxscript = document.createElement('script'); + mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#'; + mathjaxscript.type = 'text/javascript'; + mathjaxscript.src = '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'; + mathjaxscript[(window.opera ? "innerHTML" : "text")] = + "MathJax.Hub.Config({" + + " config: ['MMLorHTML.js']," + + " TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," + + " jax: ['input/TeX','input/MathML','output/HTML-CSS']," + + " extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," + + " displayAlign: '"+ align +"'," + + " displayIndent: '"+ indent +"'," + + " showMathMenu: true," + + " tex2jax: { " + + " inlineMath: [ ['\\\\(','\\\\)'] ], " + + " displayMath: [ ['$$','$$'] ]," + + " processEscapes: true," + + " preview: 'TeX'," + + " }, " + + " 'HTML-CSS': { " + + " styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," + + " linebreaks: { automatic: "+ linebreak +", width: '90% container' }," + + " }, " + + "}); "; + (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript); +} +</script>Django Media 配置(方法一)2013-09-14T00:00:00+08:00Wontag:wbowam.github.io,2013-09-14:django-media-pei-zhi-fang-fa-yi.html<h5 id="env">Env:<a class="headerlink" href="#env" title="Permanent link">&para;</a></h5> +<ul> +<li>django==1.4.5</li> +<li>python==2.7</li> +<li>ubuntu==13.04</li> +</ul> +<hr /> +<h3 id="django-static-mediamedia">django 的Static 和 Media配置之Media<a class="headerlink" href="#django-static-mediamedia" title="Permanent link">&para;</a></h3> +<h3 id="settingspy">settings.py<a class="headerlink" href="#settingspy" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="cp">##added by Tulpar,20140514</span> +<span class="n">import</span> <span class="n">os</span> +<span class="n">settings_dir</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">)</span> +<span class="n">PROJECT_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">settings_dir</span><span class="p">))</span> + +<span class="n">MEDIA_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">public</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">MEDIA_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span> +</pre></div> + + +<h3 id="urlspy">urls.py<a class="headerlink" href="#urlspy" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="err">#</span><span class="vi">#added</span> <span class="k">by</span> <span class="nx">Tulpar</span><span class="p">,</span><span class="mi">20140514</span> +<span class="nb">from</span> <span class="nx">django.conf</span> <span class="k">import</span> <span class="nx">settings</span> + +<span class="nx">urlpatterns</span> <span class="o">+=</span> <span class="nx">patterns</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> + <span class="nb">url</span><span class="p">(</span><span class="nb">r</span><span class="s2">&quot;^media/(?P&lt;path&gt;.*)$&quot;</span><span class="p">,</span><span class="s2">&quot;django.views.static.serve&quot;</span><span class="p">,{</span><span class="s2">&quot;document_root&quot;</span><span class="p">:</span> <span class="nx">settings.MEDIA_ROOT</span><span class="p">,}),</span> +<span class="p">)</span> +</pre></div>Django-userena 的使用2013-09-14T00:00:00+08:00Wontag:wbowam.github.io,2013-09-14:django-userena-de-shi-yong.html<hr /> +<p>先Clone <a href="https://github.com/bread-and-pepper/django-userena.git">Github上的源码</a>,运行Demo看看效果,</p> +<div class="highlight"><pre><span class="err">进入</span><span class="n">demo</span><span class="err">目录</span> + <span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">r</span> <span class="n">requirements</span><span class="p">.</span><span class="n">txt</span> +<span class="p">(</span><span class="err">再装一个</span><span class="n">html2text</span><span class="p">)</span> +<span class="n">pip</span> <span class="n">install</span> <span class="n">html2text</span> +<span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">runserver</span> +</pre></div> + + +<p>然后再自己搭一个,如下步骤</p> +<hr /> +<h3 id="_1">安装<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p><code>pip install django-userena</code></p> +<h3 id="_2">配置<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<h4 id="1-add-userena-guardian-easy_thumbnails-to-your-installed_apps-tuple">1. add ’userena’, ’guardian’, ’easy_thumbnails’ to your INSTALLED_APPS tuple.<a class="headerlink" href="#1-add-userena-guardian-easy_thumbnails-to-your-installed_apps-tuple" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="err">’</span><span class="n">userena</span><span class="err">’</span><span class="p">,</span> +<span class="err">’</span><span class="n">guardian</span><span class="err">’</span><span class="p">,</span> +<span class="err">’</span><span class="n">easy_thumbnails</span><span class="err">’</span><span class="p">,</span> +</pre></div> + + +<h4 id="2-in-your-settingspy-file-add-the-following">2. in your settings.py file, add the following:<a class="headerlink" href="#2-in-your-settingspy-file-add-the-following" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">AUTHENTICATION_BACKENDS</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">&#39;</span><span class="n">userena</span><span class="p">.</span><span class="n">backends</span><span class="p">.</span><span class="n">UserenaAuthenticationBackend</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">guardian</span><span class="p">.</span><span class="n">backends</span><span class="p">.</span><span class="n">ObjectPermissionBackend</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">backends</span><span class="p">.</span><span class="n">ModelBackend</span><span class="err">&#39;</span><span class="p">,</span> + <span class="p">)</span> + +<span class="n">ANONYMOUS_USER_ID</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> +</pre></div> + + +<p>The above is used to get django-guardian working (another Django-Userena dependency that’s automatically installed to control permissions)</p> +<h3 id="3-create-a-new-app-for-your-django-userena-app-named-accountsand-add-it-to-your-installed_apps-tuple-in-your-settingspy-file">3. create a new app for your Django-Userena app named 'accounts'.and add it to your INSTALLED_APPS tuple in your settings.py file.<a class="headerlink" href="#3-create-a-new-app-for-your-django-userena-app-named-accountsand-add-it-to-your-installed_apps-tuple-in-your-settingspy-file" title="Permanent link">&para;</a></h3> +<h3 id="4-copy-the-following-into-accountsmodelspy">4. Copy the following into accounts/models.py:<a class="headerlink" href="#4-copy-the-following-into-accountsmodelspy" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> + +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">User</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">translation</span> <span class="n">import</span> <span class="n">ugettext</span> <span class="n">as</span> <span class="n">_</span> +<span class="n">from</span> <span class="n">userena</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">UserenaBaseProfile</span> + +<span class="n">class</span> <span class="n">MyProfile</span><span class="p">(</span><span class="n">UserenaBaseProfile</span><span class="p">)</span><span class="o">:</span> + <span class="n">user</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span><span class="n">unique</span><span class="o">=</span><span class="n">True</span><span class="p">,</span><span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">),</span><span class="n">related_name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">my_profile</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">favourite_snack</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">favourite</span> <span class="n">snack</span><span class="err">&#39;</span><span class="p">),</span><span class="n">max_length</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span> +</pre></div> + + +<h3 id="5-next-add-the-following-into-settingspy-file">5. Next add the following into settings.py file :<a class="headerlink" href="#5-next-add-the-following-into-settingspy-file" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">AUTH_PROFILE_MODULE</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">accounts</span><span class="p">.</span><span class="n">MyProfile</span><span class="err">&#39;</span> + +<span class="n">LOGIN_REDIRECT_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">accounts</span><span class="o">/%</span><span class="p">(</span><span class="n">username</span><span class="p">)</span><span class="n">s</span><span class="o">/</span><span class="err">&#39;</span> +<span class="n">LOGIN_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">accounts</span><span class="o">/</span><span class="n">signin</span><span class="o">/</span><span class="err">&#39;</span> +<span class="n">LOGOUT_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">accounts</span><span class="o">/</span><span class="n">signout</span><span class="o">/</span><span class="err">&#39;</span> +</pre></div> + + +<h3 id="6-add-the-following-into-urlspy-under-the-urlpatterns-tuple">6. Add the following into urls.py under the ‘urlpatterns’ tuple:<a class="headerlink" href="#6-add-the-following-into-urlspy-under-the-urlpatterns-tuple" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="p">(</span><span class="n">r</span><span class="err">&#39;</span><span class="o">^</span><span class="n">accounts</span><span class="o">/</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="err">&#39;</span><span class="n">userena</span><span class="p">.</span><span class="n">urls</span><span class="err">&#39;</span><span class="p">)),</span> +</pre></div> + + +<h3 id="7-configure-your-django-smtp-email-settings-to-use-gmail-in-settingspy">7. Configure your Django SMTP email settings to use Gmail in settings.py:<a class="headerlink" href="#7-configure-your-django-smtp-email-settings-to-use-gmail-in-settingspy" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">EMAIL_USE_TLS</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">EMAIL_HOST</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">smtp</span><span class="p">.</span><span class="n">gmail</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">EMAIL_PORT</span> <span class="o">=</span> <span class="mi">587</span> +<span class="n">EMAIL_HOST_USER</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">yourgmailaccount</span><span class="err">@</span><span class="n">gmail</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">EMAIL_HOST_PASSWORD</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">yourgmailpassword</span><span class="err">&#39;</span> +</pre></div> + + +<h3 id="8configure-your-media-files-to-use-mugshots">8.Configure your Media files to use mugshots<a class="headerlink" href="#8configure-your-media-files-to-use-mugshots" title="Permanent link">&para;</a></h3> +<h4 id="settingspy">settings.py<a class="headerlink" href="#settingspy" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="cp">##added by Tulpar,20140514</span> +<span class="n">import</span> <span class="n">os</span> +<span class="n">settings_dir</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">)</span> +<span class="n">PROJECT_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">settings_dir</span><span class="p">))</span> + +<span class="n">MEDIA_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">public</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">MEDIA_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span> +</pre></div> + + +<h4 id="urlspy">urls.py<a class="headerlink" href="#urlspy" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="err">#</span><span class="vi">#added</span> <span class="k">by</span> <span class="nx">Tulpar</span><span class="p">,</span><span class="mi">20140514</span> +<span class="nb">from</span> <span class="nx">django.conf</span> <span class="k">import</span> <span class="nx">settings</span> + +<span class="nx">urlpatterns</span> <span class="o">+=</span> <span class="nx">patterns</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> + <span class="nb">url</span><span class="p">(</span><span class="nb">r</span><span class="s2">&quot;^media/(?P&lt;path&gt;.*)$&quot;</span><span class="p">,</span><span class="s2">&quot;django.views.static.serve&quot;</span><span class="p">,{</span><span class="s2">&quot;document_root&quot;</span><span class="p">:</span> <span class="nx">settings.MEDIA_ROOT</span><span class="p">,}),</span> +<span class="p">)</span> +</pre></div> + + +<hr /> +<p>That's All</p> +<h2 id="errors">Errors<a class="headerlink" href="#errors" title="Permanent link">&para;</a></h2> +<h4 id="1ioerror-at-adminaccountmyprofileadd">1.```IOError at /admin/account/myprofile/add/<a class="headerlink" href="#1ioerror-at-adminaccountmyprofileadd" title="Permanent link">&para;</a></h4> +<p>decoder jpeg not available```</p> +<h6 id="pilowjpg">错误原因是Pilow的jpg图片支持组件没有安装<a class="headerlink" href="#pilowjpg" title="Permanent link">&para;</a></h6> +<p>1、先卸载安装的Pillow<br /> +<code>pip uninstall Pillow</code><br /> +2、安装JPEG和FREETYPE2库 </p> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">libjpeg</span><span class="o">-</span><span class="n">dev</span> +<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">libfreetype6</span><span class="o">-</span><span class="n">dev</span> +</pre></div> + + +<p>3.重新安装Pillow</p> +<div class="highlight"><pre><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">I</span> <span class="n">pillow</span> +</pre></div> + + +<h4 id="2no-such-table-easy-thumbnails-source">2.<code>no such table: easy thumbnails source</code><a class="headerlink" href="#2no-such-table-easy-thumbnails-source" title="Permanent link">&para;</a></h4> +<h5 id="_3">解决方法:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h5> +<p>1.installed app里加</p> +<div class="highlight"><pre> <span class="err">#</span><span class="n">added</span> <span class="n">by</span> <span class="n">Tulpar</span><span class="p">,</span><span class="mi">20140601</span> + <span class="err">&#39;</span><span class="n">easy_thumbnails</span><span class="err">&#39;</span> +</pre></div> + + +<p>2.settins.py里加</p> +<div class="highlight"><pre><span class="cp">##added by Tulpar,20140601</span> +<span class="n">import</span> <span class="n">os</span> +<span class="n">settings_dir</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">)</span> +<span class="n">PROJECT_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">settings_dir</span><span class="p">))</span> + +<span class="n">MEDIA_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">public</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">MEDIA_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span> +</pre></div> + + +<hr /> +<h3 id="djangoadminuserenaregister">后台使用django默认的admin时,userena已经默认给你register好了<a class="headerlink" href="#djangoadminuserenaregister" title="Permanent link">&para;</a></h3> +<h3 id="xadminregister">后台如果是使用Xadmin,就得自行register一下,如:<a class="headerlink" href="#xadminregister" title="Permanent link">&para;</a></h3> +<p><code>adminx.py</code> </p> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> +<span class="cp">#from django.contrib import admin</span> + +<span class="cp"># Register your models here.</span> +<span class="n">import</span> <span class="n">xadmin</span> + +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">MyProfile</span> + +<span class="n">class</span> <span class="n">MyProfileAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="err">#</span><span class="n">search_fields</span><span class="o">=</span><span class="p">(</span><span class="err">&#39;</span><span class="n">name</span><span class="sc">&#39;,&#39;</span><span class="n">category</span><span class="sc">&#39;,&#39;</span><span class="n">content</span><span class="err">&#39;</span><span class="p">)</span> + <span class="err">#</span><span class="n">prepopulated_fields</span> <span class="o">=</span> <span class="p">{</span> <span class="err">&#39;</span><span class="n">message</span><span class="err">&#39;</span><span class="o">:</span> <span class="p">[</span><span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">]</span> <span class="p">}</span><span class="err">##</span><span class="n">learned</span> <span class="n">at</span> <span class="n">http</span><span class="o">:</span><span class="c1">//www.b-list.org/weblog/2008/dec/24/admin/</span> + <span class="err">#</span><span class="n">exclude</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">created_by</span><span class="err">&#39;</span><span class="p">,)</span> + <span class="err">#</span><span class="n">actions</span> <span class="o">=</span> <span class="p">[</span><span class="n">Songda</span><span class="p">,</span> <span class="p">]</span> + <span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="sc">&#39;,&#39;</span><span class="n">favourite_snack</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">list_display_links</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">,)</span> + <span class="n">ordering</span> <span class="o">=</span> <span class="p">(</span><span class="s">&quot;-user&quot;</span><span class="p">,)</span> + <span class="n">list_filter</span><span class="o">=</span><span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">,)</span><span class="err">#该属性指定可以过滤的列的名字</span><span class="p">,</span> <span class="err">系统会自动生成搜索器</span> + <span class="n">search_fields</span><span class="o">=</span><span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">,)</span><span class="err">#属性指定可以通过搜索框搜索的数据列的名字</span><span class="p">,</span> <span class="err">搜索框搜索使用的是模糊查找的方式</span><span class="p">,</span> <span class="err">一般用来搜素名字等字符串字段</span> + <span class="n">list_export</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">xls</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">xml</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">json</span><span class="err">&#39;</span><span class="p">)</span><span class="err">#该插件在数据列表页面提供了数据导出功能</span><span class="p">,</span> <span class="err">可以导出</span> <span class="n">Excel</span><span class="p">,</span> <span class="n">CSV</span><span class="p">,</span> <span class="n">XML</span><span class="p">,</span> <span class="n">json</span> <span class="err">格式</span><span class="p">.</span> + <span class="err">#</span> <span class="err">这会显示一个下拉列表</span><span class="p">,</span> <span class="err">用户可以选择</span><span class="mi">3</span><span class="err">秒或</span><span class="mi">5</span><span class="err">秒刷新一次页面</span><span class="p">.</span> + <span class="n">refresh_times</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span><span class="mi">500</span><span class="p">)</span> + <span class="n">list_editable</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">favourite_snack</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">show_detail_fields</span> <span class="o">=</span> <span class="p">[</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">,]</span><span class="err">#该插件可以在列表页中显示相关字段的详细信息</span><span class="p">,</span> <span class="err">使用</span> <span class="n">Ajax</span> <span class="err">在列表页中显示</span><span class="p">.</span> + +<span class="n">xadmin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">MyProfile</span><span class="p">,</span><span class="n">MyProfileAdmin</span><span class="p">)</span> +</pre></div>Git 入门2013-09-08T00:00:00+08:00Wontag:wbowam.github.io,2013-09-08:git-ru-men.html<p>之前入门过git,只是入门,不明白原理,不会用建分支,没法完成一些稍有难度的工作。因此,一直想再学学,一直是想,直到......<br /> +好朋友wwj推荐<a href="http://igit.linuxtoy.org/">沉浸式学 Git</a>,看了一下:特别喜欢,再学学,走起! +感谢<a href="http://igit.linuxtoy.org/">徐小东</a>,感谢<a href="http://wwj718.github.io/">wwj</a>.</p> +<hr /> +<h3 id="_1">安装<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<h5 id="linux">Linux<a class="headerlink" href="#linux" title="Permanent link">&para;</a></h5> +<p><code>$ apt-get install git</code> <br /> +Or <br /> +<code>$ yum install git-core</code></p> +<h5 id="mac">Mac<a class="headerlink" href="#mac" title="Permanent link">&para;</a></h5> +<p>请参阅<a href="http://git-scm.com/book/en/Getting-Started-Installing-Git">Mac 安装Git</a></p> +<h5 id="windows">windows<a class="headerlink" href="#windows" title="Permanent link">&para;</a></h5> +<p>请参阅 <a href="http://git-scm.com/book/en/Getting-Started-Installing-Git">Windows 安装Git</a></p> +<hr /> +<h3 id="_2">开始使用<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<h4 id="1">1. 创建新仓库<a class="headerlink" href="#1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">mkdir</span> <span class="n">hello</span> +<span class="n">cd</span> <span class="n">hello</span> +<span class="n">git</span> <span class="n">init</span> +</pre></div> + + +<p>添加新内容 +<code>vim hello.rb</code><br /> +<code>git add hello.rb</code>或<code>git add .</code> <br /> +添加注释 </p> +<div class="highlight"><pre><span class="n">git</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s">&quot;First Commit&quot;</span> +</pre></div> + + +<p>推送改动<br /> +<code>git push origin master</code> </p> +<h4 id="2">2. 检查仓库状态<a class="headerlink" href="#2" title="Permanent link">&para;</a></h4> +<p><code>git status</code></p> +<h4 id="3-history">3. 查看历史(history)<a class="headerlink" href="#3-history" title="Permanent link">&para;</a></h4> +<p>本地 <br /> +<code>git log</code><br /> +线上的版本<br /> +<code>git log --pretty=oneline</code> </p> +<h4 id="4">4.改命令别名<a class="headerlink" href="#4" title="Permanent link">&para;</a></h4> +<p>这个很有用。以前重复敲很多很长的命令——烦!这下好了'.'</p> +<h6 id="gitconfig">找到.gitconfig,记得先备份一下啊<a class="headerlink" href="#gitconfig" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="k">[alias]</span> + <span class="na">co</span> <span class="o">=</span> <span class="s">checkout</span> +<span class="s"> ci = commit</span> +<span class="s"> st = status</span> +<span class="s"> br = branch</span> +<span class="s"> hist = log --pretty=format:&#39;%h %ad | %s%d [%an]&#39; --graph --date=short</span> +<span class="s"> type = cat-file -t</span> +<span class="s"> dump = cat-file -p</span> +</pre></div> + + +<h4 id="5">5.检出仓库<a class="headerlink" href="#5" title="Permanent link">&para;</a></h4> +<h6 id="_3">执行如下命令以创建一个本地仓库的克隆版本:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h6> +<p><code>git clone /path/to/repository</code> </p> +<h5 id="_4">创建一个远程仓库的克隆版本:<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h5> +<p><code>git clone username@host:/path/to/repository</code></p> +<h3 id="6">6.分支<a class="headerlink" href="#6" title="Permanent link">&para;</a></h3> +<p>分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”。在其他分支上进行开发,完成后再将它们合并到主分支上。<a href="http://www.bootcss.com/p/git-guide/img/branches.png">原理图</a> </p> +<h5 id="feature_x">创建一个叫做“feature_x”的分支,并切换过去:<a class="headerlink" href="#feature_x" title="Permanent link">&para;</a></h5> +<p><code>git checkout -b feature_x</code></p> +<h6 id="_5">切换回主分支:<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h6> +<p><code>git checkout master</code></p> +<h6 id="feature_x_1">再切换到分支feature_x:<a class="headerlink" href="#feature_x_1" title="Permanent link">&para;</a></h6> +<p><code>git checkout feature_x</code></p> +<h5 id="_6">删除分支<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h5> +<p><code>git branch -d feature_x</code> </p> +<h6 id="_7"><strong>所有的操作之后别忘了推送</strong><a class="headerlink" href="#_7" title="Permanent link">&para;</a></h6> +<h4 id="7">7.更新与合并<a class="headerlink" href="#7" title="Permanent link">&para;</a></h4> +<p>更新<br /> +<code>git pull</code> +合并<br /> +<code>git merge &lt;branch&gt;</code></p> +<hr /> +<p>先就这些吧,谢谢光顾!</p>git 取消错误的上传2013-07-23T00:00:00+08:00Wontag:wbowam.github.io,2013-07-23:git-qu-xiao-cuo-wu-de-shang-chuan.html<h5 id="stackoverflow">参考<a href="http://stackoverflow.com/questions/448919/how-can-i-remove-a-commit-on-github">Stackoverflow</a><a class="headerlink" href="#stackoverflow" title="Permanent link">&para;</a></h5> +<h4 id="_1">通过如下命令显示最近的上传情况<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<p><code>git rebase -i HEAD~3</code> </p> +<h6 id="2head10">将会显示最近的2个上传,也可以显示任意个,如<code>HEAD~10</code><a class="headerlink" href="#2head10" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="n">pick</span> <span class="n">d877e57</span> <span class="o">%</span><span class="n">s</span> +<span class="n">pick</span> <span class="n">f032eda</span> <span class="o">%</span><span class="n">s</span> +<span class="n">pick</span> <span class="n">e545efa</span> <span class="n">jiali</span> + +<span class="cp"># Rebase eb78f1f..f032eda onto eb78f1f</span> +<span class="cp">#</span> +<span class="cp"># Commands:</span> +<span class="cp"># p, pick = use commit</span> +<span class="cp"># r, reword = use commit, but edit the commit message</span> +<span class="cp"># e, edit = use commit, but stop for amending</span> +<span class="cp"># s, squash = use commit, but meld into previous commit</span> +<span class="cp"># f, fixup = like &quot;squash&quot;, but discard this commit&#39;s log message</span> +<span class="cp"># x, exec = run command (the rest of the line) using shell</span> +<span class="cp">#</span> +<span class="cp"># If you remove a line here THAT COMMIT WILL BE LOST.</span> +<span class="cp"># However, if you remove everything, the rebase will be aborted.</span> +<span class="cp">#</span> +</pre></div> + + +<p>再此我想取消,备注为“jiali”的上传, </p> +<h4 id="_2">删除第三行<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<h4 id="_3">然后通过下面的命令,强制上传即可<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4> +<p><code>git push origin +master</code> </p>linux 小技巧(2)2013-05-29T00:00:00+08:00Wontag:wbowam.github.io,2013-05-29:linux-xiao-ji-qiao-2.html<h3 id="1">1.纯命令行下用鼠标<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<h1 id="gpm">gpm<a class="headerlink" href="#gpm" title="Permanent link">&para;</a></h1> +<h5 id="gpm_1">安装gpm服务<a class="headerlink" href="#gpm_1" title="Permanent link">&para;</a></h5> +<p><code>sudo apt-get install gpm</code></p> +<h5 id="_1">使用<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<p><code>serviece gpm start</code></p>count(*) vs exists()2013-02-04T00:00:00+08:00Wontag:wbowam.github.io,2013-02-04:count-vs-exists.html<blockquote> +<h5 id="exists-vs-count-the-battle-never-ends">Exists Vs. Count(*) - The battle never ends...<a class="headerlink" href="#exists-vs-count-the-battle-never-ends" title="Permanent link">&para;</a></h5> +<p>I am still amazed at how many of the database applications written today still disregard some basic rules of thumb when it comes to accessing the data. One in particular is the use of COUNT(*) to check to see if there are any rows that match some criteria. + ——Andrew Kelly</p> +</blockquote> +<h4 id="_1">让我们做个了结....<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<hr /> +<h3 id="_2">情景:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p>判断是否存在<code>cat=”极客“</code>的Article</p> +<h5 id="_3">方法一:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">count</span> <span class="o">=</span> <span class="n">Article</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">cat</span><span class="o">=</span><span class="s">&quot;极客&quot;</span><span class="p">).</span><span class="n">count</span><span class="p">()</span> +<span class="k">if</span> <span class="n">count</span><span class="err">:</span> + <span class="err">#</span> <span class="n">balabala</span><span class="p">...</span> +</pre></div> + + +<p>SQL: <code>SELECT COUNT(*) FROM table_article WHERE cat="极客";</code></p> +<h5 id="_4">方法二:<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">exist</span> <span class="o">=</span> <span class="n">Article</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">cat</span><span class="o">=</span><span class="s">&quot;极客&quot;</span><span class="p">).</span><span class="n">exists</span><span class="p">()</span> +<span class="k">if</span> <span class="n">exist</span><span class="o">:</span> + <span class="err">#</span> <span class="n">balabalabala</span><span class="p">....</span> +</pre></div> + + +<p>SQL: <code>EXISTS (SELECT * FROM table_article WHERE cat="极客")</code> <br /> +<a href="http://sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/exists-vs-count-the-battle-never-ends.aspx">查看</a></p> +<h4 id="2cat">当只有2条符合要求的数据(cat="极客")时,查询情况<a class="headerlink" href="#2cat" title="Permanent link">&para;</a></h4> +<ul> +<li>方法一:</li> +</ul> +<div class="highlight"><pre><span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">3</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span> +</pre></div> + + +<ul> +<li>方法二 :+1: </li> +</ul> +<div class="highlight"><pre> <span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">2</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mf">0.</span> +</pre></div> + + +<h4 id="4688">当有4688条符合要求的数据时,查询情况如下<a class="headerlink" href="#4688" title="Permanent link">&para;</a></h4> +<ul> +<li>方法一:</li> +</ul> +<div class="highlight"><pre> <span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">11</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mf">0.</span> +</pre></div> + + +<ul> +<li>方法二 :+1: </li> +</ul> +<div class="highlight"><pre><span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">2</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mf">0.</span> +</pre></div> + + +<h4 id="357121317">当没有索引,有357条符合要求的数据,总共有121317条数据时,查询情况如下<a class="headerlink" href="#357121317" title="Permanent link">&para;</a></h4> +<ul> +<li>方法一:</li> +</ul> +<div class="highlight"><pre> <span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">1241</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">331</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mf">0.</span> +</pre></div> + + +<ul> +<li>方法二 :+1: </li> +</ul> +<div class="highlight"><pre><span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">5</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mf">0.</span> +</pre></div> \ No newline at end of file diff --git a/feeds/won.rss.xml b/feeds/won.rss.xml index 9b00d4d..69828d9 100644 --- a/feeds/won.rss.xml +++ b/feeds/won.rss.xml @@ -151,6 +151,18 @@ <span class="mi">2</span><span class="p">)</span> <span class="nx">Then</span> <span class="nx">change</span> <span class="nx">ownership</span><span class="p">:</span> <span class="nb">chown</span> <span class="nx">mysql.mysql</span> <span class="o">&lt;</span><span class="nb">filename</span><span class="o">&gt;</span> <span class="mi">3</span><span class="p">)</span> <span class="nx">Now</span> <span class="nx">try</span> <span class="nx">LOAD</span> <span class="kd">DATA</span> <span class="nx">INFILE</span> <span class="nx">command.</span> <span class="nx">It</span> <span class="nx">will</span> <span class="nx">work.</span> +</pre></div> + + +<p><strong> Displaying Query Results Vertically</strong></p> +<div class="highlight"><pre><span class="n">select</span> <span class="o">*</span> <span class="n">from</span> <span class="n">name</span> <span class="n">limit</span> <span class="mi">10</span><span class="p">,</span><span class="mi">1</span><span class="err">\</span><span class="n">G</span><span class="p">;</span> +</pre></div> + + +<p><strong>drop table with foreign Key</strong> </p> +<div class="highlight"><pre><span class="n">SET</span> <span class="n">foreign_key_checks</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> +<span class="n">drop</span> <span class="n">table</span> <span class="p">...</span> +<span class="n">SET</span> <span class="n">foreign_key_checks</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> </pre></div>WonMon, 30 Mar 2015 00:00:00 +0800tag:wbowam.github.io,2015-03-30:mysql-dai-ma-pian-duan.htmlMysqlSnippetsPython 代码片段http://wbowam.github.io/python-dai-ma-pian-duan.html<h4 id="python-logging">python logging<a class="headerlink" href="#python-logging" title="Permanent link">&para;</a></h4> <div class="highlight"><pre><span class="n">import</span> <span class="n">logging</span> <span class="n">logging</span><span class="p">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">getcwd</span><span class="p">(),</span> <span class="err">&#39;</span><span class="n">log</span><span class="p">.</span><span class="n">txt</span><span class="err">&#39;</span><span class="p">),</span> <span class="n">level</span> <span class="o">=</span> <span class="n">logging</span><span class="p">.</span><span class="n">DEBUG</span><span class="p">)</span> @@ -792,4 +804,4337 @@ grep 能够匹配的模式可以 很复杂,但是现在我们把 <p>grep - 打印匹配行</p> </blockquote> <p>神一样的命令终于出现了,看到这里我再次确定这是一本好书了 -话说XX推荐用<a href="http://beyondgrep.com/">ACK</a>替代grep</p>WonSun, 29 Mar 2015 00:00:00 +0800tag:wbowam.github.io,2015-03-29:tlcl-kan-shu-bi-ji-2.htmlTLCL \ No newline at end of file +话说XX推荐用<a href="http://beyondgrep.com/">ACK</a>替代grep</p>WonSun, 29 Mar 2015 00:00:00 +0800tag:wbowam.github.io,2015-03-29:tlcl-kan-shu-bi-ji-2.htmlTLCLDjango开启 the sites frameworkhttp://wbowam.github.io/djangokai-qi-the-sites-framework.html<p>以下内容来自Django文档</p> +<div class="highlight"><pre><span class="n">Changed</span> <span class="n">in</span> <span class="n">Django</span> <span class="mf">1.6</span><span class="o">:</span> +<span class="n">In</span> <span class="n">previous</span> <span class="n">versions</span><span class="p">,</span> <span class="n">the</span> <span class="n">sites</span> <span class="n">framework</span> <span class="n">was</span> <span class="n">enabled</span> <span class="n">by</span> <span class="k">default</span><span class="p">.</span> + +<span class="n">To</span> <span class="n">enable</span> <span class="n">the</span> <span class="n">sites</span> <span class="n">framework</span><span class="p">,</span> <span class="n">follow</span> <span class="n">these</span> <span class="n">steps</span><span class="o">:</span> + +<span class="n">Add</span> <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sites</span><span class="err">&#39;</span> <span class="n">to</span> <span class="n">your</span> <span class="n">INSTALLED_APPS</span> <span class="n">setting</span><span class="p">.</span> + +<span class="n">Define</span> <span class="n">a</span> <span class="n">SITE_ID</span> <span class="n">setting</span><span class="o">:</span> + +<span class="n">SITE_ID</span> <span class="o">=</span> <span class="mi">1</span> +<span class="n">Run</span> <span class="n">migrate</span><span class="p">.</span> +</pre></div>WonTue, 07 Oct 2014 00:00:00 +0800tag:wbowam.github.io,2014-10-07:djangokai-qi-the-sites-framework.htmlDjangoDjango 1.7试用http://wbowam.github.io/django-17shi-yong.html<p>首先感谢django团队,在这一版本里django自身提供了数据迁移功能——migration</p> +<h3 id="_1">数据迁移<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>修改Model后可以在不影响现有数据的前提下重建表结构。 </p> +<h6 id="southsouthdjango">以往的解决方案是South(于是South成为了django必备的,最受欢迎的应用。)<a class="headerlink" href="#southsouthdjango" title="Permanent link">&para;</a></h6> +<h4 id="_2">原理<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p>django的migration功能,类似与South的migration功能。 </p> +<h5 id="_3">开始一个新的项目<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">django</span><span class="o">-</span><span class="n">admin</span><span class="p">.</span><span class="n">py</span> <span class="n">startproject</span> <span class="n">mysite</span> +<span class="cp">## Create the tables in the database before we can use them.</span> +<span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">migrate</span> +<span class="cp">## Create superuser.</span> +<span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">createsuperuser</span> +</pre></div> + + +<h5 id="app">创建app:<a class="headerlink" href="#app" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">startapp</span> <span class="n">myblog</span> +<span class="cp">##1.7版django这一步时会创建一个migrations/目录</span> +</pre></div> + + +<div class="highlight"><pre><span class="cp">##settings.py</span> +<span class="n">INSTALLED_APPS</span> <span class="o">=</span><span class="p">(</span> + <span class="err">####</span> + <span class="err">&#39;</span><span class="n">myblog</span><span class="err">&#39;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<div class="highlight"><pre><span class="cp">##models.py</span> +<span class="n">class</span> <span class="n">Article</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> +</pre></div> + + +<h5 id="_4">生成数据表<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h5> +<p>(覆盖了syncdb功能,不过别担心,syncdb仍然还有~) </p> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">makemigrations</span> <span class="n">myblog</span> +</pre></div> + + +<p>运行结果如下</p> +<div class="highlight"><pre><span class="n">Migrations</span> <span class="k">for</span> <span class="err">‘</span><span class="n">myblog</span><span class="err">’</span><span class="o">:</span> + <span class="mo">0001</span><span class="n">_initial</span><span class="p">.</span><span class="n">py</span><span class="o">:</span> + <span class="o">-</span> <span class="n">Create</span> <span class="n">model</span> <span class="n">Article</span> +</pre></div> + + +<p>看看生成了哪些文件</p> +<div class="highlight"><pre><span class="n">ls</span> <span class="n">myblog</span><span class="o">/</span><span class="n">migrations</span><span class="o">/</span> +<span class="n">__init__</span><span class="p">.</span><span class="n">py</span> <span class="mo">0001</span><span class="n">_initial</span><span class="p">.</span><span class="n">py</span> +</pre></div> + + +<h4 id="modelsauthor">修改models,添加一个author属性<a class="headerlink" href="#modelsauthor" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Article</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + <span class="n">author</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> +</pre></div> + + +<h5 id="_5">生成数据表(修改后)<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">makemigrations</span> <span class="n">myblog</span> +<span class="cp">##运行结果</span> +<span class="n">Migrations</span> <span class="k">for</span> <span class="err">‘</span><span class="n">myblog</span><span class="err">’</span><span class="o">:</span> + <span class="mo">0002</span><span class="n">_article_author</span><span class="p">.</span><span class="n">py</span><span class="o">:</span> + <span class="o">-</span> <span class="n">Add</span> <span class="n">field</span> <span class="n">author</span> <span class="n">to</span> <span class="n">article</span> +</pre></div> + + +<p>我们来看看他重新生成数据表时干了些什么 +<em> 从上一个migration中获取之前的Model列表,写到set中. +</em> 获取现有的model列表,写入set中。 +* 遍历这两个set的差集,获取差集Model中所有的field,如果field的定义相同,就询问用户是否是一个rename的model,否则视为创建。</p> +<h4 id="migrate">数据迁移(migrate)<a class="headerlink" href="#migrate" title="Permanent link">&para;</a></h4> +<p><code>python manage.py migrate myblog</code> </p> +<hr /> +<p>That's all +以上是个人对migration的理解,求纠错和指点~~</p>WonSun, 07 Sep 2014 00:00:00 +0800tag:wbowam.github.io,2014-09-07:django-17shi-yong.htmlDjangodjango 国际化http://wbowam.github.io/django-guo-ji-hua.html<h2 id="python">第一步:在你的Python代码和模板中嵌入待翻译的字符串。<a class="headerlink" href="#python" title="Permanent link">&para;</a></h2> +<p>我选择用如下方式: <br /> +models </p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">translation</span> <span class="n">import</span> <span class="n">ugettext_lazy</span> <span class="n">as</span> <span class="n">_</span> + +<span class="n">class</span> <span class="n">MyThing</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">name</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">),</span> <span class="n">help_text</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">This</span> <span class="n">is</span> <span class="n">the</span> <span class="n">help</span> <span class="n">text</span><span class="err">&#39;</span><span class="p">))</span> + <span class="n">class</span> <span class="n">Meta</span><span class="o">:</span> + <span class="n">verbose_name</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">my</span> <span class="n">thing</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">verbose_name_plural</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">mythings</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>template </p> +<div class="highlight"><pre><span class="cp">{%</span> <span class="k">load</span> <span class="nv">i18n</span> <span class="cp">%}</span> 放在模板最前面。 +###翻译一个常量字符串 (括以单或双引号) 或 可变内容: +<span class="nt">&lt;title&gt;</span><span class="cp">{%</span> <span class="k">trans</span> <span class="s2">&quot;This is the title.&quot;</span> <span class="cp">%}</span><span class="nt">&lt;/title&gt;</span> +<span class="nt">&lt;title&gt;</span><span class="cp">{%</span> <span class="k">trans</span> <span class="nv">myvar</span> <span class="cp">%}</span><span class="nt">&lt;/title&gt;</span> +### 如果你的译文要求字符串带有变量(占位符placeholders),请使用 <span class="cp">{%</span> <span class="k">blocktrans</span> <span class="cp">%}</span> : +<span class="cp">{%</span> <span class="k">blocktrans</span> <span class="cp">%}</span>This string will have <span class="cp">{{</span> <span class="nv">value</span> <span class="cp">}}</span> inside.<span class="cp">{%</span> <span class="k">endblocktrans</span> <span class="cp">%}</span> +</pre></div> + + +<h2 id="_1">第二步:把那些字符串翻译成你要支持的语言。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2> +<h4 id="_2">为一种语言创建一个信息文件:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p>在三处之一运行如下命令: </p> +<ul> +<li> +<p>Django项目根目录。(首选)</p> +</li> +<li> +<p>您Django应用的根目录。</p> +</li> +<li> +<p>django 根目录(不是Subversion检出目录,而是通过 $PYTHONPATH 链接或位于该路径的某处)。 这仅和你为Django自己创建一个翻译时有关 <br /> +<code>django-admin.py makemessages -l zh</code></p> +</li> +</ul> +<h4 id="po">在po文件里进行翻译并保存<a class="headerlink" href="#po" title="Permanent link">&para;</a></h4> +<h4 id="_3">编译信息文件<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4> +<p>在你运行<code>django-admin.py makemessages</code>的目录下运行: <br /> +<code>django-admin.py compilemessages</code></p> +<h2 id="django-settings">第三步:在你的Django settings文件中激活本地中间件。<a class="headerlink" href="#django-settings" title="Permanent link">&para;</a></h2> +<p>在 MIDDLEWARE_CLASSES 设置中增加 'django.middleware.locale.LocaleMiddleware' 。 <br /> + 中间件的顺序是有影响的,最好按照依照以下要求: </p> +<ul> +<li> +<p>保证它是第一批安装的中间件类。 </p> +</li> +<li> +<p>因为 LocalMiddleware 要用到session数据,所以需要放在 SessionMiddleware 之后。</p> +</li> +<li> +<p>如果你使用CacheMiddleware,把LocaleMiddleware放在它后面。 +如下:</p> +</li> +</ul> +<div class="highlight"><pre><span class="n">MIDDLEWARE_CLASSES</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sessions</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">SessionMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">locale</span><span class="p">.</span><span class="n">LocaleMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">common</span><span class="p">.</span><span class="n">CommonMiddleware</span><span class="err">&#39;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div>WonSun, 07 Sep 2014 00:00:00 +0800tag:wbowam.github.io,2014-09-07:django-guo-ji-hua.htmlDjangoDjango 数据查询http://wbowam.github.io/django-shu-ju-cha-xun.html<div class="highlight"><pre><span class="n">class</span> <span class="n">Poll</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">slug</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">SlugField</span><span class="p">(</span><span class="n">unique_for_month</span><span class="o">=</span><span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">question</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">maxlength</span><span class="o">=</span><span class="mi">255</span><span class="p">)</span> + <span class="n">pub_date</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">DateTimeField</span><span class="p">()</span> + <span class="n">expire_date</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">DateTimeField</span><span class="p">()</span> + + <span class="n">def</span> <span class="n">__repr__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">question</span> + + <span class="n">class</span> <span class="n">Meta</span><span class="o">:</span> + <span class="n">get_latest_by</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span> + + + + + +<span class="n">class</span> <span class="n">Choice</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">poll</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">Poll</span><span class="p">,</span> <span class="n">edit_inline</span><span class="o">=</span><span class="n">models</span><span class="p">.</span><span class="n">TABULAR</span><span class="p">,</span> + <span class="n">num_in_admin</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">min_num_in_admin</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span> + <span class="n">choice</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">maxlength</span><span class="o">=</span><span class="mi">255</span><span class="p">,</span> <span class="n">core</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + <span class="n">votes</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">editable</span><span class="o">=</span><span class="n">False</span><span class="p">,</span> <span class="k">default</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + + <span class="n">def</span> <span class="n">__repr__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">choice</span> +</pre></div> + + +<h3 id="p1">获得一个数据对象p1<a class="headerlink" href="#p1" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">from</span> <span class="n">datetime</span> <span class="n">import</span> <span class="n">datetime</span> +<span class="n">p1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span>\ + <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="n">p1</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +</pre></div> + + +<ul> +<li>数据对象有一个初始方法save()</li> +</ul> +<h3 id="_1">获取结果集对象<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<h4 id="p2">无限制获取对象集p2<a class="headerlink" href="#p2" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">p2</span><span class="o">=</span><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">p2</span> +<span class="p">[</span><span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">up</span><span class="o">?</span><span class="p">,</span> <span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">your</span> <span class="n">name</span><span class="o">?</span><span class="p">]</span> +</pre></div> + + +<h6 id="p2_1">注意:在这里p2是个对象集,自身也是个对象。<a class="headerlink" href="#p2_1" title="Permanent link">&para;</a></h6> +<h4 id="_2">增加一些限制条件直到描述的子集满足你的需要。<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p>最常用的两个定制结果集的方法是:</p> +<div class="highlight"><pre><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> +<span class="err">返回一个匹配查询参数的新的结果集</span><span class="p">.</span> +<span class="n">exclude</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> +<span class="err">返回一个不匹配查询参数的新的结果集</span><span class="p">.</span> +</pre></div> + + +<p>这两个方法的返回值都是结果集对象,因此结果集可以进行链式处理:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;What&quot;</span><span class="p">)</span>\ + <span class="p">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span>\ + <span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span> +</pre></div> + + +<p>以一个初始结果集作为参数, 然后进行过滤, 再进行排除, 再进行另一个过滤. <br /> +这样得到的最终结果就一个问题开头单词是 "What", 发布日期在 2005年1月1日至今的所有民意测验的集合. </p> +<p>每个结果集都是一个独一无二的对象. 以上操作的每一步都生成了一个新的结果集: </p> +<div class="highlight"><pre><span class="n">q1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;What&quot;</span><span class="p">)</span> +<span class="n">q2</span> <span class="o">=</span> <span class="n">q1</span><span class="p">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +<span class="n">q3</span> <span class="o">=</span> <span class="n">q1</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +</pre></div> + + +<p>这三步生成了三个结果集; 一个初始结果集包含所有的以"What"开头的民意测验, 两个初始结果集的子集(一个排除条件,一个过滤条件). <br /> +对原始结果集的改进过程并没有影响到原始的结果集.</p> +<h6 id="_3">值得注意的是结果集的创建根本没有访问数据库.只有当对结果集取值时才会访问数据库.<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h6> +<h3 id="_4">字段查询<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<p>以 field__lookuptype (注意是双下线)形式进行基本的字段查询,举例来说:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__lte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +</pre></div> + + +<p>该查询翻译成SQL就是:</p> +<div class="highlight"><pre><span class="n">SELECT</span> <span class="o">*</span> <span class="n">FROM</span> <span class="n">polls_polls</span> <span class="n">WHERE</span> <span class="n">pub_date</span> <span class="o">&lt;=</span> <span class="n">NOW</span><span class="p">();</span> +</pre></div> + + +<h3 id="db-api">DB API 支持下列查找类型:<a class="headerlink" href="#db-api" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="err">类型</span> <span class="err">描述</span> +<span class="n">exact</span> <span class="err">精确匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">14</span><span class="p">).</span> +<span class="n">iexact</span> <span class="err">忽略大小写的精确匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">slug__iexact</span><span class="o">=</span><span class="s">&quot;foo&quot;</span><span class="p">)</span> <span class="err">匹配</span> <span class="n">foo</span><span class="p">,</span> <span class="n">FOO</span><span class="p">,</span> <span class="n">fOo</span><span class="p">,</span> <span class="err">等等</span><span class="p">.</span> +<span class="n">contains</span> <span class="err">大小写敏感的内容包含测试</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__contains</span><span class="o">=</span><span class="s">&quot;spam&quot;</span><span class="p">)</span> <span class="err">返回</span><span class="n">question</span> <span class="err">中包含</span> <span class="s">&quot;spam&quot;</span> <span class="err">的所有民意测验</span><span class="p">.(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span> <span class="n">MySQL</span><span class="err">支持</span><span class="p">.</span> <span class="n">SQLite</span> <span class="err">的</span><span class="n">LIKE</span> <span class="err">语句不支持大小写敏感特性</span><span class="p">.</span> <span class="err">对</span><span class="n">Sqlite</span> <span class="err">来说</span><span class="p">,</span> <span class="n">contains</span> <span class="err">等于</span> <span class="n">icontains</span><span class="p">.)</span> +<span class="n">icontains</span> <span class="err">大小写不敏感的内容包含测试</span><span class="o">:</span> +<span class="n">gt</span> <span class="err">大于</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__gt</span><span class="o">=</span><span class="mi">4</span><span class="p">).</span> +<span class="n">gte</span> <span class="err">大于等于</span><span class="p">.</span> +<span class="n">lt</span> <span class="err">小于</span><span class="p">.</span> +<span class="n">lte</span> <span class="err">小于等于</span><span class="p">.</span> +<span class="n">ne</span> <span class="err">不等于</span><span class="p">.</span> +<span class="n">in</span> <span class="err">位于给定列表中</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__in</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">])</span> <span class="err">返回一个</span> <span class="n">polls</span> <span class="err">列表</span><span class="p">(</span><span class="n">ID</span> <span class="err">值分别是</span> <span class="mi">1</span><span class="err">或</span><span class="mi">3</span><span class="err">或</span><span class="mi">4</span><span class="p">).</span> +<span class="n">startswith</span> <span class="err">大小写敏感的</span> <span class="n">starts</span><span class="o">-</span><span class="n">with</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;Would&quot;</span><span class="p">).(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span><span class="n">MySQL</span><span class="err">支持</span><span class="p">.</span> <span class="n">SQLite</span> <span class="err">的</span><span class="n">LIKE</span> <span class="err">语句不支持大小写敏感特性</span><span class="p">.</span> <span class="err">对</span><span class="n">Sqlite</span> <span class="err">来说</span><span class="p">,</span><span class="err">``</span><span class="n">startswith</span><span class="err">``</span> <span class="err">等于</span> <span class="n">istartswith</span><span class="p">)</span> +<span class="n">endswith</span> <span class="err">大小写敏感的</span> <span class="n">ends</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> <span class="p">(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span> <span class="n">MySQL</span><span class="p">)</span> +<span class="n">istartswith</span> <span class="err">大小写不敏感的</span> <span class="n">starts</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> +<span class="n">iendswith</span> <span class="err">大小写不敏感的</span> <span class="n">ends</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> +<span class="n">range</span> <span class="err">范围测试</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__range</span><span class="o">=</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">))</span> <span class="err">返回</span> <span class="n">pub_date</span> <span class="err">位于</span> <span class="n">start_date</span> <span class="err">和</span> <span class="n">end_date</span> <span class="p">(</span><span class="err">包括</span><span class="p">)</span><span class="err">之间的所有民意测验</span> +<span class="n">year</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">年</span> <span class="err">匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">get_count</span><span class="p">(</span><span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">).</span> +<span class="n">month</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">月</span> <span class="err">匹配</span><span class="o">:</span> +<span class="n">day</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">日</span> <span class="err">匹配</span><span class="o">:</span> +<span class="n">isnull</span> <span class="n">True</span><span class="o">/</span><span class="n">False</span><span class="p">;</span> <span class="err">做</span> <span class="n">IF</span> <span class="nb">NULL</span><span class="o">/</span><span class="n">IF</span> <span class="n">NOT</span> <span class="nb">NULL</span> <span class="err">查询</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">expire_date__isnull</span><span class="o">=</span><span class="n">True</span><span class="p">).</span> +</pre></div> + + +<h6 id="exact">如果未提供查找类型, 系统就认为查找类型是 exact . 下面两个语句是等价的:<a class="headerlink" href="#exact" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">id</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span> +<span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span> +</pre></div> + + +<h5 id="and">查询允许多个条件参数, 逗号分隔的多个条件参数会被 "AND" 起来使用:<a class="headerlink" href="#and" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span> + <span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">,</span> + <span class="n">pub_date__month</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> + <span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;Would&quot;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<p>得到2005年1月公布的带有一个"Would"开头的问题的所有民意测验.</p> +<h5 id="pk-primary_key__exact">为了使用更加方便, 还提供有一个 pk 查找类型, 可以翻译成 (primary_key)__exact.<a class="headerlink" href="#pk-primary_key__exact" title="Permanent link">&para;</a></h5> +<p>在这个民意测试的例子里, 下面两个语句是等价的.:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +</pre></div> + + +<h5 id="pk">pk 也可以通过连接进行查询.<a class="headerlink" href="#pk" title="Permanent link">&para;</a></h5> +<p>在这个民意测试的例子里, 下面两个语句是等价的:</p> +<div class="highlight"><pre><span class="n">choices</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">poll__id__exact</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">choices</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">poll__pk</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +</pre></div> + + +<p>如果传递的关键字参数非法, 将引发 TypeError 异常.</p> +<h4 id="or">OR 查询<a class="headerlink" href="#or" title="Permanent link">&para;</a></h4> +<p>关键字参数查询的各个条件都是 "AND" 关系. 如果你需要一个复杂的查询(举例来说,你需要一个 OR 语句), 你需要使用 Q 对象. <br /> +Q 对象是 django.core.meta.Q 的实例, 用来装载一系列关键字参数. 这些关键字参数就象指定给 get() 和 filter() 函数的关键字参数一样. 举例来说:</p> +<div class="highlight"><pre><span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">What</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>Q 对象可以使用 &amp; 和 | 运算符进行组合. 当两个Q对象进行 &amp; 或 | 运算时,会生成一个新的Q对象.举例来说语句:</p> +<div class="highlight"><pre><span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">Who</span><span class="err">&#39;</span><span class="p">)</span> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">What</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>生成一个新的 Q 对象表示这两个 "question__startswith" 查询条件的 "OR" 关系. 等同于下面的 SQL WHERE 子句:</p> +<div class="highlight"><pre> <span class="n">WHERE</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">Who</span><span class="o">%</span><span class="err">&#39;</span> <span class="n">OR</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">What</span><span class="o">%</span><span class="err">&#39;</span> +</pre></div> + + +<p>查询函数可以接受一个或多个 Q 对象作为参数.如果提供有多个 Q 对象参数, 它们将被 "AND" 到一起. 举例来说:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span> +<span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">Who</span><span class="err">&#39;</span><span class="p">),</span> +<span class="n">Q</span><span class="p">(</span><span class="n">pub_date__exact</span><span class="o">=</span><span class="n">date</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">pub_date__exact</span><span class="o">=</span><span class="n">date</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> +<span class="p">)</span> +</pre></div> + + +<p>翻译成 SQL 就是这样:</p> +<div class="highlight"><pre><span class="n">SELECT</span> <span class="o">*</span> <span class="n">from</span> <span class="n">polls</span> <span class="n">WHERE</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">Who</span><span class="o">%</span><span class="err">&#39;</span> +<span class="n">AND</span> <span class="p">(</span><span class="n">pub_date</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2005</span><span class="o">-</span><span class="mo">05</span><span class="o">-</span><span class="mo">02</span><span class="err">&#39;</span> <span class="n">OR</span> <span class="n">pub_date</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2005</span><span class="o">-</span><span class="mo">05</span><span class="o">-</span><span class="mo">06</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h3 id="_5">从结果集中取值<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3> +<p>只有通过取值操作才能得到结果集包含的对象.取值操作可以通过迭代,切片,或其它专门的函数来实现. </p> +<h5 id="_6">一个结果集就是一个可迭代对象.<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h5> +<p>因此,可以通过一个循环来取出它的值:</p> +<div class="highlight"><pre><span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span><span class="o">:</span> +<span class="n">print</span> <span class="n">p</span> +</pre></div> + + +<p>将使用 Poll 对象的 <strong>repr</strong>() 方法打印出所有的 Poll 对象.</p> +<h5 id="_7">一个结果集也可以被切片, 使用数组符号操作:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">fifth_poll</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="mi">4</span><span class="p">]</span> +<span class="n">all_polls_but_the_first_two</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="mi">2</span><span class="o">:</span><span class="p">]</span> +<span class="n">every_second_poll</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="o">::</span><span class="mi">2</span><span class="p">]</span> +</pre></div> + + +<h6 id="-">结果集对象是惰性对象 - 也就是说,他们不是 真正的 包含他们表示对象的集合 (或列表).<a class="headerlink" href="#-" title="Permanent link">&para;</a></h6> +<h6 id="python-django">Python 的协议魔法让结果集看起来是一个可迭代,可切片的对象. 事实上在幕后, Django 使用了缓存技术..<a class="headerlink" href="#python-django" title="Permanent link">&para;</a></h6> +<p>如果你真的需要一个列表, 你可以强制对一个惰性对象取值:</p> +<div class="highlight"><pre><span class="n">querylist</span> <span class="o">=</span> <span class="n">list</span><span class="p">(</span><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">())</span> +</pre></div> + + +<p>不过,最好不要这么做,尤其当一个结果集相当大时. 由于 Django 要创建每一个对象的内存表示,这将占用相当大的内存.</p> +<h3 id="_8">结果集及其缓存行为<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h3> +<p>每个结果集都包含一个 cache. 对一个新创建的结果集来说, 缓存区是空的.当一个结果集第一次被取值, Django 会进行一次数据库查询,并将查询结果放入缓存中, 之后返回用户需要的数据. 后面的取值操作会使用缓存中的数据而不用再次访问数据库.</p> +<p>必须时刻记住:结果集具有缓存行为. 下面两行语句生成了两个临时的结果集,并进行了取值,之后舍弃:</p> +<div class="highlight"><pre><span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">Query</span> <span class="n">Set</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">Query</span> <span class="n">Set</span> <span class="n">again</span> +</pre></div> + + +<p>对一个小型的,低流量的站点来说,这不会造成严重问题. <br /> +不过,对一个高访问量的站点来说,它双倍增加了数据库服务器的负担. <br /> +另外,由于在两次操作之间可能有其它的用户增加或删除了投票,因此这两次操作得到结果可能并不相同.</p> +<h5 id="_9">要避免这个问题, 保存这个结果集并在后面重用该结果集:<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">queryset</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">queryset</span><span class="p">]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">query</span> <span class="n">set</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">queryset</span><span class="p">]</span> <span class="err">#</span> <span class="n">Re</span><span class="o">-</span><span class="n">use</span> <span class="n">the</span> <span class="n">cache</span> <span class="n">from</span> <span class="n">the</span> <span class="n">evaluation</span> +</pre></div> + + +<h3 id="_10">关系 (连接)<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h3> +<p>当你在 model 中定义了一个关系字段(也就是,一个ForeignKey, OneToOneField, 或 ManyToManyField).<br /> +Django 使用关系字段的名字为 model 的每个实例添加一个 描述符. <br /> +在访问对象或关联对象时, 这个描述符就象一个常规属性. <br /> +举例来说, mychoice.poll 会返回 Choice 实例对象关联的 Poll 对象.</p> +<p>通过下面的关系,连接可以以非显式的方式进行: <br /> +<code>choices.objects.filter(poll__slug="eggs")</code> <br /> +得到一个 Choice 对象列表, 这些对象关联的 Poll 对象的 slug 字段值为 eggs. 允许多级连接. </p> +<p>通过一个对象实例的便利函数(convenience functions)就可直接查询该对象的关联对象. 举例来说, 如果 p 是一个 Poll 实例, p.choice_set() 将返回所有关联的 Choice 对象列表. 聪明的读者会注意到它等价于 choices.objects.filter(poll__id=p.id), 只是更加清晰.</p> +<h4 id="one-to-one-relations">One-to-one relations<a class="headerlink" href="#one-to-one-relations" title="Permanent link">&para;</a></h4> +<h5 id="one-to-one-get_relatedobjectname">one-to-one 关系中的每个对象拥有一个 get_relatedobjectname() 方法.<a class="headerlink" href="#one-to-one-get_relatedobjectname" title="Permanent link">&para;</a></h5> +<p>举例来说:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Place</span><span class="p">(</span><span class="n">meta</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> +<span class="cp"># ...</span> + +<span class="n">class</span> <span class="n">Restaurant</span><span class="p">(</span><span class="n">meta</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> +<span class="cp"># ...</span> + <span class="n">the_place</span> <span class="o">=</span> <span class="n">meta</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">places</span><span class="p">.</span><span class="n">Place</span><span class="p">)</span> +</pre></div> + + +<p>在上面的例子里, 每个 Place 会自动拥有一个 get_restaurant() 方法, <br /> +且每个 Restaurant 会自动拥有一个 get_the_place() 方法.</p> +<h4 id="many-to-one-relations">Many-to-one relations<a class="headerlink" href="#many-to-one-relations" title="Permanent link">&para;</a></h4> +<p>在 many-to-one 关系中, 关联对象(Many)会自动拥有一个 get_relatedobject() 方法. <br /> +被关联的对象(one)会自动拥有 get_relatedobject(), get_relatedobject_list(), 和 get_relatedobject_count() 方法 (功能与模块级的 get_object(), filter(), 和 get_count() 相同).</p> +<p>在上面的民意测试例子里, 一个 Poll 对象 p 自动拥有下列方法:</p> +<div class="highlight"><pre><span class="n">p</span><span class="p">.</span><span class="n">get_choice</span><span class="p">()</span> +<span class="n">p</span><span class="p">.</span><span class="n">get_choice_list</span><span class="p">()</span> +<span class="n">p</span><span class="p">.</span><span class="n">get_choice_count</span><span class="p">()</span> +</pre></div> + + +<p>Choice 对象 c 则自动拥有下面的方法: +<code>c.get_poll()</code> </p> +<h4 id="many-to-many">Many-to-many 关系<a class="headerlink" href="#many-to-many" title="Permanent link">&para;</a></h4> +<p>Many-to-many 关系类似<code>Many-to-one relations</code>_, 它生成同样的方法集.例外的是关联对象的 get_relatedobject_list() 方法返回一个实例的列表而不是一个仅一个实例.因此,若 Poll 和 Choice 是 many-to-many 关系, choice.get_poll_list() 将返回一个列表. </p> +<h5 id="_11">专门的结果集<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h5> +<p>除 filter 和 exclude() 之外, Django 提供了一系列结果集处理方法, 修改结果的类型, 或修改 sql 查询在数据库执行的方式.</p> +<div class="highlight"><pre><span class="n">order_by</span><span class="p">(</span><span class="o">*</span><span class="n">fields</span><span class="p">)</span> +</pre></div> + + +<p>根据 model 中提供 ordering tuple, 结果集会被自动排序. 不过, 排序也可以通过 order_by 方法显式的进行:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">,</span> +<span class="n">pub_date__month</span><span class="o">=</span><span class="mi">1</span><span class="p">).</span><span class="n">order_by</span><span class="p">(</span><span class="err">&#39;</span><span class="o">-</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>结果集将按降序排列 pub_date, 然后按升序排列 question."-pub_date" 中的负号表示降序(递减).要取随机序,使用"?", 象下面这样:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">order_by</span><span class="o">=</span><span class="p">(</span><span class="sc">&#39;?&#39;</span><span class="p">)</span> +</pre></div> + + +<p>要按另一个表中的字段排序, 添加另一个表的名字和一个句点,象下面这样:</p> +<div class="highlight"><pre><span class="n">Choice</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">order_by</span><span class="o">=</span><span class="p">(</span><span class="err">&#39;</span><span class="n">Poll</span><span class="p">.</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">choice</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h3 id="valuesfields">values(*fields)<a class="headerlink" href="#valuesfields" title="Permanent link">&para;</a></h3> +<p>类似 filter(), 不过它返回一个字典的列表而不是 model 实例对象的列表. </p> +<p>它接受一个可选参数: fields, 这是一个字段名列表或tuple.如果你没有指定 fields, 每个字段都会返回. <br /> +否则就只返回你指定的字段名和值.这里有一个例子,使用上面定义的 Poll model</p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">from</span> <span class="n">datetime</span> <span class="n">import</span> <span class="n">datetime</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span> +<span class="p">...</span> <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p1</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p2</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s your name?&quot;</span><span class="p">,</span> +<span class="p">...</span> <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p2</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="p">[</span><span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">up</span><span class="o">?</span><span class="p">,</span> <span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">your</span> <span class="n">name</span><span class="o">?</span><span class="p">]</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">values</span><span class="p">()</span> +<span class="p">[{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="o">:</span> <span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="err">&#39;</span><span class="n">expire_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">)},</span> +<span class="p">{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="o">:</span> <span class="s">&quot;What&#39;s your name?&quot;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="err">&#39;</span><span class="n">expire_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">)}]</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">values</span><span class="p">(</span><span class="n">fields</span><span class="o">=</span><span class="p">[</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="p">])</span> +<span class="p">[{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">},</span> <span class="p">{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">}]</span> +</pre></div> + + +<h4 id="model-values">当你知道你要取得哪些字段的值时并且你不需要那些 model实例对象的功能时,使用 values() 函数.<a class="headerlink" href="#model-values" title="Permanent link">&para;</a></h4>WonSun, 07 Sep 2014 00:00:00 +0800tag:wbowam.github.io,2014-09-07:django-shu-ju-cha-xun.htmlDjangoDjango Validatorshttp://wbowam.github.io/django-validators.html<p>之前没用过Validators <br /> +这回入了门,用了一下,很爽~~ </p> +<hr /> +<p><a href="https://docs.djangoproject.com/en/dev/ref/validators/">Django Validators</a> </p> +<h5 id="djangovalidators">正如django文档所说:我们可以自己新建各种Validators,如:<a class="headerlink" href="#djangovalidators" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">exceptions</span> <span class="n">import</span> <span class="n">ValidationError</span> + +<span class="n">def</span> <span class="n">validate_even</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">:</span> + <span class="k">if</span> <span class="n">value</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="o">:</span> + <span class="n">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="err">&#39;</span><span class="o">%</span><span class="n">s</span> <span class="n">is</span> <span class="n">not</span> <span class="n">an</span> <span class="n">even</span> <span class="n">number</span><span class="err">&#39;</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span> +</pre></div> + + +<p>You can add this to a model field via the field’s validators argument: </p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> + +<span class="n">class</span> <span class="n">MyModel</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">even_field</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">validate_even</span><span class="p">])</span> +</pre></div> + + +<p>神奇点在于,django自动帮我们抓取‘值’当作参数传入我们的Validators(有点像让人讨厌的黑魔术,但不是~~) </p> +<h5 id="validatorsformmodelform">同一个Validators也可以用于form,因为model和form相应的机理是一样的<a class="headerlink" href="#validatorsformmodelform" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span> <span class="n">import</span> <span class="n">forms</span> + +<span class="n">class</span> <span class="n">MyForm</span><span class="p">(</span><span class="n">forms</span><span class="p">.</span><span class="n">Form</span><span class="p">)</span><span class="o">:</span> + <span class="n">even_field</span> <span class="o">=</span> <span class="n">forms</span><span class="p">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">validate_even</span><span class="p">])</span> +</pre></div> + + +<h3 id="validatorsbuilt-in-validators">不过,多数时候我们喜欢用内置的Validators,也就是官网说的<code>Built-in validators</code><a class="headerlink" href="#validatorsbuilt-in-validators" title="Permanent link">&para;</a></h3> +<p>用法如下:</p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">validators</span> <span class="n">import</span> <span class="n">MinLengthValidator</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> + +<span class="n">class</span> <span class="n">MyModel</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">even_field</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">TextField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">MinLengthValidator</span><span class="p">(</span><span class="mi">20</span><span class="p">)])</span> +</pre></div> + + +<p>以上所用<code>MinLengthValidator</code>网名生意:<code>max_length</code>的反意思。 <br /> +还有很多内置Validator,<a href="https://docs.djangoproject.com/en/dev/ref/validators/">看官网</a></p> +<h3 id="validator">假如我想改一下内置 Validator的错误提示,可以这么干:<a class="headerlink" href="#validator" title="Permanent link">&para;</a></h3> +<p>1.自己写一个子类,覆盖message</p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">validators</span> <span class="n">import</span> <span class="n">MinLengthValidator</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> + +<span class="n">class</span> <span class="n">MyMinLengthValidator</span><span class="p">(</span><span class="n">MinLengthValidator</span><span class="p">)</span><span class="o">:</span> + <span class="n">message</span> <span class="o">=</span> <span class="s">&quot;少年, 至少输入%(limit_value)d个字符 ,(你怎么只输入 %(show_value)d个字符就完事儿啊).&quot;</span> + +<span class="n">class</span> <span class="n">MyModel</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">even_field</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">TextField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">MinLengthValidator</span><span class="p">(</span><span class="mi">20</span><span class="p">)])</span> +</pre></div> + + +<ol> +<li>当然,这种方法很简单,很常见,不够高大上:填写<code>error_messages</code>选项</li> +</ol> +<div class="highlight"><pre><span class="p">....</span> +<span class="n">my_field</span> <span class="o">=</span> <span class="n">forms</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">MinLengthValidator</span><span class="p">(</span><span class="mi">8</span><span class="p">)],</span> + <span class="n">error_messages</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;min_length&quot;</span><span class="o">:</span><span class="s">&quot;少年, 至少输入%(limit_value)d个字符 ,(你怎么只输入 %(show_value)d个字符就完事儿啊).&quot;</span><span class="p">})</span> +<span class="p">})</span> +<span class="p">..</span> <span class="p">.</span> <span class="p">..</span> +</pre></div>WonSun, 07 Sep 2014 00:00:00 +0800tag:wbowam.github.io,2014-09-07:django-validators.htmlDjangoI am just Testinghttp://wbowam.github.io/i-am-just-testing.html<div class="highlight"><pre><span class="n">class</span> <span class="n">Poll</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">slug</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">SlugField</span><span class="p">(</span><span class="n">unique_for_month</span><span class="o">=</span><span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">question</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">maxlength</span><span class="o">=</span><span class="mi">255</span><span class="p">)</span> + <span class="n">pub_date</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">DateTimeField</span><span class="p">()</span> + <span class="n">expire_date</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">DateTimeField</span><span class="p">()</span> + + <span class="n">def</span> <span class="n">__repr__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">question</span> + + <span class="n">class</span> <span class="n">Meta</span><span class="o">:</span> + <span class="n">get_latest_by</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span> + + + + + +<span class="n">class</span> <span class="n">Choice</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">poll</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">Poll</span><span class="p">,</span> <span class="n">edit_inline</span><span class="o">=</span><span class="n">models</span><span class="p">.</span><span class="n">TABULAR</span><span class="p">,</span> + <span class="n">num_in_admin</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">min_num_in_admin</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span> + <span class="n">choice</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">maxlength</span><span class="o">=</span><span class="mi">255</span><span class="p">,</span> <span class="n">core</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + <span class="n">votes</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">editable</span><span class="o">=</span><span class="n">False</span><span class="p">,</span> <span class="k">default</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> + + <span class="n">def</span> <span class="n">__repr__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">choice</span> +</pre></div> + + +<h3 id="p1">获得一个数据对象p1<a class="headerlink" href="#p1" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">from</span> <span class="n">datetime</span> <span class="n">import</span> <span class="n">datetime</span> +<span class="n">p1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span>\ + <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="n">p1</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +</pre></div> + + +<ul> +<li>数据对象有一个初始方法save()</li> +</ul> +<h3 id="_1">获取结果集对象<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<h4 id="p2">无限制获取对象集p2<a class="headerlink" href="#p2" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">p2</span><span class="o">=</span><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">p2</span> +<span class="p">[</span><span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">up</span><span class="o">?</span><span class="p">,</span> <span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">your</span> <span class="n">name</span><span class="o">?</span><span class="p">]</span> +</pre></div> + + +<h6 id="p2_1">注意:在这里p2是个对象集,自身也是个对象。<a class="headerlink" href="#p2_1" title="Permanent link">&para;</a></h6> +<h4 id="_2">增加一些限制条件直到描述的子集满足你的需要。<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p>最常用的两个定制结果集的方法是:</p> +<div class="highlight"><pre><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> +<span class="err">返回一个匹配查询参数的新的结果集</span><span class="p">.</span> +<span class="n">exclude</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> +<span class="err">返回一个不匹配查询参数的新的结果集</span><span class="p">.</span> +</pre></div> + + +<p>这两个方法的返回值都是结果集对象,因此结果集可以进行链式处理:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;What&quot;</span><span class="p">)</span>\ + <span class="p">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span>\ + <span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span> +</pre></div> + + +<p>以一个初始结果集作为参数, 然后进行过滤, 再进行排除, 再进行另一个过滤. <br /> +这样得到的最终结果就一个问题开头单词是 "What", 发布日期在 2005年1月1日至今的所有民意测验的集合. </p> +<p>每个结果集都是一个独一无二的对象. 以上操作的每一步都生成了一个新的结果集: </p> +<div class="highlight"><pre><span class="n">q1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;What&quot;</span><span class="p">)</span> +<span class="n">q2</span> <span class="o">=</span> <span class="n">q1</span><span class="p">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +<span class="n">q3</span> <span class="o">=</span> <span class="n">q1</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__gte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +</pre></div> + + +<p>这三步生成了三个结果集; 一个初始结果集包含所有的以"What"开头的民意测验, 两个初始结果集的子集(一个排除条件,一个过滤条件). <br /> +对原始结果集的改进过程并没有影响到原始的结果集.</p> +<h6 id="_3">值得注意的是结果集的创建根本没有访问数据库.只有当对结果集取值时才会访问数据库.<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h6> +<h3 id="_4">字段查询<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<p>以 field__lookuptype (注意是双下线)形式进行基本的字段查询,举例来说:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__lte</span><span class="o">=</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">())</span> +</pre></div> + + +<p>该查询翻译成SQL就是:</p> +<div class="highlight"><pre><span class="n">SELECT</span> <span class="o">*</span> <span class="n">FROM</span> <span class="n">polls_polls</span> <span class="n">WHERE</span> <span class="n">pub_date</span> <span class="o">&lt;=</span> <span class="n">NOW</span><span class="p">();</span> +</pre></div> + + +<h3 id="db-api">DB API 支持下列查找类型:<a class="headerlink" href="#db-api" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="err">类型</span> <span class="err">描述</span> +<span class="n">exact</span> <span class="err">精确匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">14</span><span class="p">).</span> +<span class="n">iexact</span> <span class="err">忽略大小写的精确匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">slug__iexact</span><span class="o">=</span><span class="s">&quot;foo&quot;</span><span class="p">)</span> <span class="err">匹配</span> <span class="n">foo</span><span class="p">,</span> <span class="n">FOO</span><span class="p">,</span> <span class="n">fOo</span><span class="p">,</span> <span class="err">等等</span><span class="p">.</span> +<span class="n">contains</span> <span class="err">大小写敏感的内容包含测试</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__contains</span><span class="o">=</span><span class="s">&quot;spam&quot;</span><span class="p">)</span> <span class="err">返回</span><span class="n">question</span> <span class="err">中包含</span> <span class="s">&quot;spam&quot;</span> <span class="err">的所有民意测验</span><span class="p">.(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span> <span class="n">MySQL</span><span class="err">支持</span><span class="p">.</span> <span class="n">SQLite</span> <span class="err">的</span><span class="n">LIKE</span> <span class="err">语句不支持大小写敏感特性</span><span class="p">.</span> <span class="err">对</span><span class="n">Sqlite</span> <span class="err">来说</span><span class="p">,</span> <span class="n">contains</span> <span class="err">等于</span> <span class="n">icontains</span><span class="p">.)</span> +<span class="n">icontains</span> <span class="err">大小写不敏感的内容包含测试</span><span class="o">:</span> +<span class="n">gt</span> <span class="err">大于</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__gt</span><span class="o">=</span><span class="mi">4</span><span class="p">).</span> +<span class="n">gte</span> <span class="err">大于等于</span><span class="p">.</span> +<span class="n">lt</span> <span class="err">小于</span><span class="p">.</span> +<span class="n">lte</span> <span class="err">小于等于</span><span class="p">.</span> +<span class="n">ne</span> <span class="err">不等于</span><span class="p">.</span> +<span class="n">in</span> <span class="err">位于给定列表中</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__in</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">])</span> <span class="err">返回一个</span> <span class="n">polls</span> <span class="err">列表</span><span class="p">(</span><span class="n">ID</span> <span class="err">值分别是</span> <span class="mi">1</span><span class="err">或</span><span class="mi">3</span><span class="err">或</span><span class="mi">4</span><span class="p">).</span> +<span class="n">startswith</span> <span class="err">大小写敏感的</span> <span class="n">starts</span><span class="o">-</span><span class="n">with</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;Would&quot;</span><span class="p">).(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span><span class="n">MySQL</span><span class="err">支持</span><span class="p">.</span> <span class="n">SQLite</span> <span class="err">的</span><span class="n">LIKE</span> <span class="err">语句不支持大小写敏感特性</span><span class="p">.</span> <span class="err">对</span><span class="n">Sqlite</span> <span class="err">来说</span><span class="p">,</span><span class="err">``</span><span class="n">startswith</span><span class="err">``</span> <span class="err">等于</span> <span class="n">istartswith</span><span class="p">)</span> +<span class="n">endswith</span> <span class="err">大小写敏感的</span> <span class="n">ends</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> <span class="p">(</span><span class="err">仅</span><span class="n">PostgreSQL</span> <span class="err">和</span> <span class="n">MySQL</span><span class="p">)</span> +<span class="n">istartswith</span> <span class="err">大小写不敏感的</span> <span class="n">starts</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> +<span class="n">iendswith</span> <span class="err">大小写不敏感的</span> <span class="n">ends</span><span class="o">-</span><span class="n">with</span><span class="p">.</span> +<span class="n">range</span> <span class="err">范围测试</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__range</span><span class="o">=</span><span class="p">(</span><span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">))</span> <span class="err">返回</span> <span class="n">pub_date</span> <span class="err">位于</span> <span class="n">start_date</span> <span class="err">和</span> <span class="n">end_date</span> <span class="p">(</span><span class="err">包括</span><span class="p">)</span><span class="err">之间的所有民意测验</span> +<span class="n">year</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">年</span> <span class="err">匹配</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">get_count</span><span class="p">(</span><span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">).</span> +<span class="n">month</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">月</span> <span class="err">匹配</span><span class="o">:</span> +<span class="n">day</span> <span class="err">对</span> <span class="n">date</span><span class="o">/</span><span class="n">datetime</span> <span class="err">字段</span><span class="p">,</span> <span class="err">进行精确的</span> <span class="err">日</span> <span class="err">匹配</span><span class="o">:</span> +<span class="n">isnull</span> <span class="n">True</span><span class="o">/</span><span class="n">False</span><span class="p">;</span> <span class="err">做</span> <span class="n">IF</span> <span class="nb">NULL</span><span class="o">/</span><span class="n">IF</span> <span class="n">NOT</span> <span class="nb">NULL</span> <span class="err">查询</span><span class="o">:</span> <span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">expire_date__isnull</span><span class="o">=</span><span class="n">True</span><span class="p">).</span> +</pre></div> + + +<h6 id="exact">如果未提供查找类型, 系统就认为查找类型是 exact . 下面两个语句是等价的:<a class="headerlink" href="#exact" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">id</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span> +<span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span> +</pre></div> + + +<h5 id="and">查询允许多个条件参数, 逗号分隔的多个条件参数会被 "AND" 起来使用:<a class="headerlink" href="#and" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span> + <span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">,</span> + <span class="n">pub_date__month</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> + <span class="n">question__startswith</span><span class="o">=</span><span class="s">&quot;Would&quot;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<p>得到2005年1月公布的带有一个"Would"开头的问题的所有民意测验.</p> +<h5 id="pk-primary_key__exact">为了使用更加方便, 还提供有一个 pk 查找类型, 可以翻译成 (primary_key)__exact.<a class="headerlink" href="#pk-primary_key__exact" title="Permanent link">&para;</a></h5> +<p>在这个民意测试的例子里, 下面两个语句是等价的.:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">id__exact</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +</pre></div> + + +<h5 id="pk">pk 也可以通过连接进行查询.<a class="headerlink" href="#pk" title="Permanent link">&para;</a></h5> +<p>在这个民意测试的例子里, 下面两个语句是等价的:</p> +<div class="highlight"><pre><span class="n">choices</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">poll__id__exact</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">choices</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">poll__pk</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +</pre></div> + + +<p>如果传递的关键字参数非法, 将引发 TypeError 异常.</p> +<h4 id="or">OR 查询<a class="headerlink" href="#or" title="Permanent link">&para;</a></h4> +<p>关键字参数查询的各个条件都是 "AND" 关系. 如果你需要一个复杂的查询(举例来说,你需要一个 OR 语句), 你需要使用 Q 对象. <br /> +Q 对象是 django.core.meta.Q 的实例, 用来装载一系列关键字参数. 这些关键字参数就象指定给 get() 和 filter() 函数的关键字参数一样. 举例来说:</p> +<div class="highlight"><pre><span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">What</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>Q 对象可以使用 &amp; 和 | 运算符进行组合. 当两个Q对象进行 &amp; 或 | 运算时,会生成一个新的Q对象.举例来说语句:</p> +<div class="highlight"><pre><span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">Who</span><span class="err">&#39;</span><span class="p">)</span> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">What</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>生成一个新的 Q 对象表示这两个 "question__startswith" 查询条件的 "OR" 关系. 等同于下面的 SQL WHERE 子句:</p> +<div class="highlight"><pre> <span class="n">WHERE</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">Who</span><span class="o">%</span><span class="err">&#39;</span> <span class="n">OR</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">What</span><span class="o">%</span><span class="err">&#39;</span> +</pre></div> + + +<p>查询函数可以接受一个或多个 Q 对象作为参数.如果提供有多个 Q 对象参数, 它们将被 "AND" 到一起. 举例来说:</p> +<div class="highlight"><pre><span class="n">polls</span><span class="p">.</span><span class="n">get_object</span><span class="p">(</span> +<span class="n">Q</span><span class="p">(</span><span class="n">question__startswith</span><span class="o">=</span><span class="err">&#39;</span><span class="n">Who</span><span class="err">&#39;</span><span class="p">),</span> +<span class="n">Q</span><span class="p">(</span><span class="n">pub_date__exact</span><span class="o">=</span><span class="n">date</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">pub_date__exact</span><span class="o">=</span><span class="n">date</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> +<span class="p">)</span> +</pre></div> + + +<p>翻译成 SQL 就是这样:</p> +<div class="highlight"><pre><span class="n">SELECT</span> <span class="o">*</span> <span class="n">from</span> <span class="n">polls</span> <span class="n">WHERE</span> <span class="n">question</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="n">Who</span><span class="o">%</span><span class="err">&#39;</span> +<span class="n">AND</span> <span class="p">(</span><span class="n">pub_date</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2005</span><span class="o">-</span><span class="mo">05</span><span class="o">-</span><span class="mo">02</span><span class="err">&#39;</span> <span class="n">OR</span> <span class="n">pub_date</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2005</span><span class="o">-</span><span class="mo">05</span><span class="o">-</span><span class="mo">06</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h3 id="_5">从结果集中取值<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3> +<p>只有通过取值操作才能得到结果集包含的对象.取值操作可以通过迭代,切片,或其它专门的函数来实现. </p> +<h5 id="_6">一个结果集就是一个可迭代对象.<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h5> +<p>因此,可以通过一个循环来取出它的值:</p> +<div class="highlight"><pre><span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span><span class="o">:</span> +<span class="n">print</span> <span class="n">p</span> +</pre></div> + + +<p>将使用 Poll 对象的 <strong>repr</strong>() 方法打印出所有的 Poll 对象.</p> +<h5 id="_7">一个结果集也可以被切片, 使用数组符号操作:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">fifth_poll</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="mi">4</span><span class="p">]</span> +<span class="n">all_polls_but_the_first_two</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="mi">2</span><span class="o">:</span><span class="p">]</span> +<span class="n">every_second_poll</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()[</span><span class="o">::</span><span class="mi">2</span><span class="p">]</span> +</pre></div> + + +<h6 id="-">结果集对象是惰性对象 - 也就是说,他们不是 真正的 包含他们表示对象的集合 (或列表).<a class="headerlink" href="#-" title="Permanent link">&para;</a></h6> +<h6 id="python-django">Python 的协议魔法让结果集看起来是一个可迭代,可切片的对象. 事实上在幕后, Django 使用了缓存技术..<a class="headerlink" href="#python-django" title="Permanent link">&para;</a></h6> +<p>如果你真的需要一个列表, 你可以强制对一个惰性对象取值:</p> +<div class="highlight"><pre><span class="n">querylist</span> <span class="o">=</span> <span class="n">list</span><span class="p">(</span><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">())</span> +</pre></div> + + +<p>不过,最好不要这么做,尤其当一个结果集相当大时. 由于 Django 要创建每一个对象的内存表示,这将占用相当大的内存.</p> +<h3 id="_8">结果集及其缓存行为<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h3> +<p>每个结果集都包含一个 cache. 对一个新创建的结果集来说, 缓存区是空的.当一个结果集第一次被取值, Django 会进行一次数据库查询,并将查询结果放入缓存中, 之后返回用户需要的数据. 后面的取值操作会使用缓存中的数据而不用再次访问数据库.</p> +<p>必须时刻记住:结果集具有缓存行为. 下面两行语句生成了两个临时的结果集,并进行了取值,之后舍弃:</p> +<div class="highlight"><pre><span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">Query</span> <span class="n">Set</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">Query</span> <span class="n">Set</span> <span class="n">again</span> +</pre></div> + + +<p>对一个小型的,低流量的站点来说,这不会造成严重问题. <br /> +不过,对一个高访问量的站点来说,它双倍增加了数据库服务器的负担. <br /> +另外,由于在两次操作之间可能有其它的用户增加或删除了投票,因此这两次操作得到结果可能并不相同.</p> +<h5 id="_9">要避免这个问题, 保存这个结果集并在后面重用该结果集:<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">queryset</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">queryset</span><span class="p">]</span> <span class="err">#</span> <span class="n">Evaluate</span> <span class="n">the</span> <span class="n">query</span> <span class="n">set</span> +<span class="n">print</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="n">in</span> <span class="n">queryset</span><span class="p">]</span> <span class="err">#</span> <span class="n">Re</span><span class="o">-</span><span class="n">use</span> <span class="n">the</span> <span class="n">cache</span> <span class="n">from</span> <span class="n">the</span> <span class="n">evaluation</span> +</pre></div> + + +<h3 id="_10">关系 (连接)<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h3> +<p>当你在 model 中定义了一个关系字段(也就是,一个ForeignKey, OneToOneField, 或 ManyToManyField).<br /> +Django 使用关系字段的名字为 model 的每个实例添加一个 描述符. <br /> +在访问对象或关联对象时, 这个描述符就象一个常规属性. <br /> +举例来说, mychoice.poll 会返回 Choice 实例对象关联的 Poll 对象.</p> +<p>通过下面的关系,连接可以以非显式的方式进行: <br /> +<code>choices.objects.filter(poll__slug="eggs")</code> <br /> +得到一个 Choice 对象列表, 这些对象关联的 Poll 对象的 slug 字段值为 eggs. 允许多级连接. </p> +<p>通过一个对象实例的便利函数(convenience functions)就可直接查询该对象的关联对象. 举例来说, 如果 p 是一个 Poll 实例, p.choice_set() 将返回所有关联的 Choice 对象列表. 聪明的读者会注意到它等价于 choices.objects.filter(poll__id=p.id), 只是更加清晰.</p> +<h4 id="one-to-one-relations">One-to-one relations<a class="headerlink" href="#one-to-one-relations" title="Permanent link">&para;</a></h4> +<h5 id="one-to-one-get_relatedobjectname">one-to-one 关系中的每个对象拥有一个 get_relatedobjectname() 方法.<a class="headerlink" href="#one-to-one-get_relatedobjectname" title="Permanent link">&para;</a></h5> +<p>举例来说:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Place</span><span class="p">(</span><span class="n">meta</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> +<span class="cp"># ...</span> + +<span class="n">class</span> <span class="n">Restaurant</span><span class="p">(</span><span class="n">meta</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> +<span class="cp"># ...</span> + <span class="n">the_place</span> <span class="o">=</span> <span class="n">meta</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">places</span><span class="p">.</span><span class="n">Place</span><span class="p">)</span> +</pre></div> + + +<p>在上面的例子里, 每个 Place 会自动拥有一个 get_restaurant() 方法, <br /> +且每个 Restaurant 会自动拥有一个 get_the_place() 方法.</p> +<h4 id="many-to-one-relations">Many-to-one relations<a class="headerlink" href="#many-to-one-relations" title="Permanent link">&para;</a></h4> +<p>在 many-to-one 关系中, 关联对象(Many)会自动拥有一个 get_relatedobject() 方法. <br /> +被关联的对象(one)会自动拥有 get_relatedobject(), get_relatedobject_list(), 和 get_relatedobject_count() 方法 (功能与模块级的 get_object(), filter(), 和 get_count() 相同).</p> +<p>在上面的民意测试例子里, 一个 Poll 对象 p 自动拥有下列方法:</p> +<div class="highlight"><pre><span class="n">p</span><span class="p">.</span><span class="n">get_choice</span><span class="p">()</span> +<span class="n">p</span><span class="p">.</span><span class="n">get_choice_list</span><span class="p">()</span> +<span class="n">p</span><span class="p">.</span><span class="n">get_choice_count</span><span class="p">()</span> +</pre></div> + + +<p>Choice 对象 c 则自动拥有下面的方法: +<code>c.get_poll()</code> </p> +<h4 id="many-to-many">Many-to-many 关系<a class="headerlink" href="#many-to-many" title="Permanent link">&para;</a></h4> +<p>Many-to-many 关系类似<code>Many-to-one relations</code>_, 它生成同样的方法集.例外的是关联对象的 get_relatedobject_list() 方法返回一个实例的列表而不是一个仅一个实例.因此,若 Poll 和 Choice 是 many-to-many 关系, choice.get_poll_list() 将返回一个列表. </p> +<h5 id="_11">专门的结果集<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h5> +<p>除 filter 和 exclude() 之外, Django 提供了一系列结果集处理方法, 修改结果的类型, 或修改 sql 查询在数据库执行的方式.</p> +<div class="highlight"><pre><span class="n">order_by</span><span class="p">(</span><span class="o">*</span><span class="n">fields</span><span class="p">)</span> +</pre></div> + + +<p>根据 model 中提供 ordering tuple, 结果集会被自动排序. 不过, 排序也可以通过 order_by 方法显式的进行:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pub_date__year</span><span class="o">=</span><span class="mi">2005</span><span class="p">,</span> +<span class="n">pub_date__month</span><span class="o">=</span><span class="mi">1</span><span class="p">).</span><span class="n">order_by</span><span class="p">(</span><span class="err">&#39;</span><span class="o">-</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>结果集将按降序排列 pub_date, 然后按升序排列 question."-pub_date" 中的负号表示降序(递减).要取随机序,使用"?", 象下面这样:</p> +<div class="highlight"><pre><span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">order_by</span><span class="o">=</span><span class="p">(</span><span class="sc">&#39;?&#39;</span><span class="p">)</span> +</pre></div> + + +<p>要按另一个表中的字段排序, 添加另一个表的名字和一个句点,象下面这样:</p> +<div class="highlight"><pre><span class="n">Choice</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">order_by</span><span class="o">=</span><span class="p">(</span><span class="err">&#39;</span><span class="n">Poll</span><span class="p">.</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">choice</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h3 id="valuesfields">values(*fields)<a class="headerlink" href="#valuesfields" title="Permanent link">&para;</a></h3> +<p>类似 filter(), 不过它返回一个字典的列表而不是 model 实例对象的列表. </p> +<p>它接受一个可选参数: fields, 这是一个字段名列表或tuple.如果你没有指定 fields, 每个字段都会返回. <br /> +否则就只返回你指定的字段名和值.这里有一个例子,使用上面定义的 Poll model</p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">from</span> <span class="n">datetime</span> <span class="n">import</span> <span class="n">datetime</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p1</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span> +<span class="p">...</span> <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p1</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p2</span> <span class="o">=</span> <span class="n">Poll</span><span class="p">(</span><span class="n">slug</span><span class="o">=</span><span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">question</span><span class="o">=</span><span class="s">&quot;What&#39;s your name?&quot;</span><span class="p">,</span> +<span class="p">...</span> <span class="n">pub_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="n">expire_date</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">p2</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">all</span><span class="p">()</span> +<span class="p">[</span><span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">up</span><span class="o">?</span><span class="p">,</span> <span class="n">What</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">your</span> <span class="n">name</span><span class="o">?</span><span class="p">]</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">values</span><span class="p">()</span> +<span class="p">[{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="o">:</span> <span class="s">&quot;What&#39;s up?&quot;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="err">&#39;</span><span class="n">expire_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">)},</span> +<span class="p">{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">question</span><span class="err">&#39;</span><span class="o">:</span> <span class="s">&quot;What&#39;s your name?&quot;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">pub_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="err">&#39;</span><span class="n">expire_date</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2005</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">20</span><span class="p">)}]</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">Poll</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">values</span><span class="p">(</span><span class="n">fields</span><span class="o">=</span><span class="p">[</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="p">])</span> +<span class="p">[{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">whatsup</span><span class="err">&#39;</span><span class="p">},</span> <span class="p">{</span><span class="err">&#39;</span><span class="n">id</span><span class="err">&#39;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">slug</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">}]</span> +</pre></div> + + +<h4 id="model-values">当你知道你要取得哪些字段的值时并且你不需要那些 model实例对象的功能时,使用 values() 函数.<a class="headerlink" href="#model-values" title="Permanent link">&para;</a></h4>WonSun, 07 Sep 2014 00:00:00 +0800tag:wbowam.github.io,2014-09-07:i-am-just-testing.htmlDjangorelated Field has invalid lookup: icontains 解决方法http://wbowam.github.io/related-field-has-invalid-lookup-icontains-jie-jue-fang-fa.html<p>这种错误常见于: </p> +<h5 id="1">1. 后台查询部分,如:<a class="headerlink" href="#1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="cp"># 有一个表Category是表Article的category外键,Category有属性叫name,</span> +<span class="n">class</span> <span class="n">ArticleAdmin</span><span class="p">(</span><span class="n">admin</span><span class="p">.</span><span class="n">ModelAdmin</span><span class="p">)</span><span class="o">:</span> + + <span class="s">&quot;&quot;&quot;</span> + <span class="n">A</span> <span class="n">simple</span> <span class="n">AdminModel</span> <span class="k">for</span> <span class="n">Article</span><span class="p">.</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="n">search_fields</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">category</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>以上情况下肯定会报一个<code>related Field has invalid lookup: icontains</code>错误 </p> +<h5 id="2">2. 你在其他地方写了查询语句,如以下函数:<a class="headerlink" href="#2" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="err">@</span><span class="n">classmethod</span> + <span class="n">def</span> <span class="n">get_articles</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">CATEGORY</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">TAG</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">NUM</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span><span class="o">:</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="n">A</span> <span class="n">simple</span> <span class="n">classmethod</span><span class="p">.</span> + <span class="n">Use</span> <span class="n">Article</span><span class="p">.</span><span class="n">get_articles</span><span class="p">(</span><span class="n">CATEGORY</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">TAG</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">NUM</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span> <span class="n">to</span> <span class="n">get</span> <span class="n">articles</span> <span class="n">list</span><span class="p">.</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="k">if</span> <span class="n">CATEGORY</span><span class="o">:</span> + <span class="n">article_list</span> <span class="o">=</span> <span class="n">cls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span> + <span class="n">Q</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">Q</span><span class="p">(</span><span class="n">category__icontains</span><span class="o">=</span><span class="n">CATEGORY</span><span class="p">))[</span><span class="o">:</span><span class="n">NUM</span><span class="p">]</span> + <span class="k">return</span> <span class="n">article_list</span> + <span class="k">return</span> <span class="n">cls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">0</span><span class="p">)[</span><span class="o">:</span><span class="n">NUM</span><span class="p">]</span> +</pre></div> + + +<p>如上第二个Q查询里。</p> +<h4 id="_1">以上两种情况原因都是一样的:设置搜索范围,如果有外键,要注明外键的哪个字段,双下划线。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">class</span> <span class="n">ArticleAdmin</span><span class="p">(</span><span class="n">admin</span><span class="p">.</span><span class="n">ModelAdmin</span><span class="p">)</span><span class="o">:</span> + + <span class="s">&quot;&quot;&quot;</span> + <span class="n">A</span> <span class="n">simple</span> <span class="n">AdminModel</span> <span class="k">for</span> <span class="n">Article</span><span class="p">.</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="n">search_fields</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">category__name</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<div class="highlight"><pre><span class="err">@</span><span class="n">classmethod</span> + <span class="n">def</span> <span class="n">get_articles</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">CATEGORY</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">TAG</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">NUM</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span><span class="o">:</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="n">A</span> <span class="n">simple</span> <span class="n">classmethod</span><span class="p">.</span> + <span class="n">Use</span> <span class="n">Article</span><span class="p">.</span><span class="n">get_articles</span><span class="p">(</span><span class="n">CATEGORY</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">TAG</span><span class="o">=</span><span class="n">None</span><span class="p">,</span> <span class="n">NUM</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span> <span class="n">to</span> <span class="n">get</span> <span class="n">articles</span> <span class="n">list</span><span class="p">.</span> + <span class="s">&quot;&quot;&quot;</span> + <span class="k">if</span> <span class="n">CATEGORY</span><span class="o">:</span> + <span class="n">article_list</span> <span class="o">=</span> <span class="n">cls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span> + <span class="n">Q</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">Q</span><span class="p">(</span><span class="n">category__name__icontains</span><span class="o">=</span><span class="n">CATEGORY</span><span class="p">))[</span><span class="o">:</span><span class="n">NUM</span><span class="p">]</span> + <span class="k">return</span> <span class="n">article_list</span> + <span class="k">return</span> <span class="n">cls</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">0</span><span class="p">)[</span><span class="o">:</span><span class="n">NUM</span><span class="p">]</span> +</pre></div>WonSun, 07 Sep 2014 00:00:00 +0800tag:wbowam.github.io,2014-09-07:related-field-has-invalid-lookup-icontains-jie-jue-fang-fa.htmlDjango试用 Django 1.7http://wbowam.github.io/shi-yong-django-17.html<p>首先感谢django团队,在这一版本里django自身提供了数据迁移功能——migration</p> +<h3 id="_1">数据迁移<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>修改Model后可以在不影响现有数据的前提下重建表结构。 </p> +<h6 id="southsouthdjango">以往的解决方案是South(于是South成为了django必备的,最受欢迎的应用。)<a class="headerlink" href="#southsouthdjango" title="Permanent link">&para;</a></h6> +<h4 id="_2">原理<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p>django的migration功能,类似与South的migration功能。 </p> +<h5 id="app">首先,创建app:<a class="headerlink" href="#app" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">startapp</span> <span class="n">myblog</span> +<span class="cp">##1.7版django这一步时会创建一个migrations/目录</span> +</pre></div> + + +<div class="highlight"><pre><span class="cp">##settings.py</span> +<span class="n">INSTALLED_APPS</span> <span class="o">=</span><span class="p">(</span> + <span class="err">####</span> + <span class="err">&#39;</span><span class="n">myblog</span><span class="err">&#39;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<div class="highlight"><pre><span class="cp">##models.py</span> +<span class="n">class</span> <span class="n">Article</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> +</pre></div> + + +<h5 id="_3">生成数据表<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h5> +<p>(不再有syncdb) </p> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">makemigrations</span> <span class="n">myblog</span> +</pre></div> + + +<p>运行结果如下</p> +<div class="highlight"><pre><span class="n">Migrations</span> <span class="k">for</span> <span class="err">‘</span><span class="n">myblog</span><span class="err">’</span><span class="o">:</span> + <span class="mo">0001</span><span class="n">_initial</span><span class="p">.</span><span class="n">py</span><span class="o">:</span> + <span class="o">-</span> <span class="n">Create</span> <span class="n">model</span> <span class="n">Article</span> +</pre></div> + + +<p>看看生成了哪些文件</p> +<div class="highlight"><pre><span class="n">ls</span> <span class="n">myblog</span><span class="o">/</span><span class="n">migrations</span><span class="o">/</span> +<span class="n">__init__</span><span class="p">.</span><span class="n">py</span> <span class="mo">0001</span><span class="n">_initial</span><span class="p">.</span><span class="n">py</span> +</pre></div> + + +<h4 id="modelsauthor">修改models,添加一个author属性<a class="headerlink" href="#modelsauthor" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Article</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + <span class="n">author</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> +</pre></div> + + +<h5 id="_4">生成数据表(修改后)<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">makemigrations</span> <span class="n">myblog</span> +<span class="cp">##运行结果</span> +<span class="n">Migrations</span> <span class="k">for</span> <span class="err">‘</span><span class="n">myblog</span><span class="err">’</span><span class="o">:</span> + <span class="mo">0002</span><span class="n">_article_author</span><span class="p">.</span><span class="n">py</span><span class="o">:</span> + <span class="o">-</span> <span class="n">Add</span> <span class="n">field</span> <span class="n">author</span> <span class="n">to</span> <span class="n">article</span> +</pre></div> + + +<p>我们来看看他重新生成数据表时干了些什么 +<em> 从上一个migration中获取之前的Model列表,写到set中. +</em> 获取现有的model列表,写入set中。 +* 遍历这两个set的差集,获取差集Model中所有的field,如果field的定义相同,就询问用户是否是一个rename的model,否则视为创建。</p> +<h4 id="migrate">数据迁移(migrate)<a class="headerlink" href="#migrate" title="Permanent link">&para;</a></h4> +<p><code>python manage.py migrate myblog</code> </p> +<hr /> +<p>That's all +以上是个人对migration的理解,求纠错和指点~~</p>WonSun, 07 Sep 2014 00:00:00 +0800tag:wbowam.github.io,2014-09-07:shi-yong-django-17.htmlDjangoUbuntu 12.04中文输入法的安装http://wbowam.github.io/ubuntu-1204zhong-wen-shu-ru-fa-de-an-zhuang.html<p>Ubuntu上的输入法主要有小小输入平台(支持拼音/二笔/五笔等),Fcitx,Ibus,Scim等。 <br /> +其中Scim和Ibus是输入法框架。 <br /> +在Ubuntu的中文系统中自带了中文输入法,通过Ctrl+Space可切换中英文输入法。 <br /> +假设我们装了Ubuntu英文系统,或系统自带输入法损坏,,,,,,, </p> +<hr /> +<h4 id="1">1.安装语言包<a class="headerlink" href="#1" title="Permanent link">&para;</a></h4> +<p>System Settings--&gt;Language Support--&gt;Install/Remove Languages<br /> +<img alt="Install /Remove Languages" src="http://tulparblog.qiniudn.com/ubuntu20120728104525690.png" /></p> +<h4 id="2ibus">2.安装并启动IBus框架<a class="headerlink" href="#2ibus" title="Permanent link">&para;</a></h4> +<p>安装Ibus框架:</p> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">ibus</span> <span class="n">ibus</span><span class="o">-</span><span class="n">clutter</span> <span class="n">ibus</span><span class="o">-</span><span class="n">gtk</span> <span class="n">ibus</span><span class="o">-</span><span class="n">gtk3</span> <span class="n">ibus</span><span class="o">-</span><span class="n">qt4</span> +</pre></div> + + +<p>启动IBus框架: +<code>im-switch -s ibus</code> <br /> +注销系统,保证更改立即生效。 </p> +<h4 id="3">3.安装拼音引擎<a class="headerlink" href="#3" title="Permanent link">&para;</a></h4> +<p>有下面几种常用选择: <br /> +IBus拼音:<code>sudo apt-get install ibus-pinyin</code> <br /> +IBUS五笔:<code>sudo apt-get install ibus-table-wubi</code> <br /> +谷歌拼音输入法:<code>sudo apt-get install ibus-googlepinyin</code> <br /> +Sun拼音输入法:<code>sudo apt-get install ibus-sunpinyin</code> </p> +<h4 id="4ibus">4.设置IBus框架<a class="headerlink" href="#4ibus" title="Permanent link">&para;</a></h4> +<p><code>ibus-setup</code> <br /> +此时,IBus Preference设置被打开。我们在Input Method选项卡中,选择自己喜欢的输入方式,并配置自己喜欢的快捷键即可。如下图所示:<img alt="Input" src="http://tulparblog.qiniudn.com/ubuntu20120728104528231.png" /></p> +<h4 id="5ibus">5.如果Ibus的图标不在右上角显示,可以使用如下命令找回<a class="headerlink" href="#5ibus" title="Permanent link">&para;</a></h4> +<p><code>ibus-daemon -drx</code></p> +<hr /> +<p>Thats all</p>WonThu, 21 Aug 2014 00:00:00 +0800tag:wbowam.github.io,2014-08-21:ubuntu-1204zhong-wen-shu-ru-fa-de-an-zhuang.htmlUbuntuLinux回家路http://wbowam.github.io/hui-jia-lu.html<h3 id="_1">就这么又一次开始了回家的旅途<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p><img alt="就这样开始" src="http://tulparblog.qiniudn.com/lifeIMG_20140711_110306.jpg" /></p> +<h3 id="3">在北京转车,得等3个小时,吃了吨开心午餐<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3> +<p><img alt="开心午餐,磨的是时间" src="http://tulparblog.qiniudn.com/lifeIMG_20140711_130640.jpg" /></p> +<h3 id="_2">两天后的驴友,醒醒吧,还有两天<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p><img alt="是的,的确很累!!!" src="http://tulparblog.qiniudn.com/lifeIMG_20140713_095127.jpg" /></p> +<h3 id="_3">吐鲁番,转车,很累,吃到家乡的拉面,很开心<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<p><img alt="虽然,做的不怎么好吃" src="http://tulparblog.qiniudn.com/lifeIMG_20140713_073856.jpg" /></p> +<h3 id="_4">终于,到家了<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<p><img alt="我家后面" src="http://tulparblog.qiniudn.com/lifeIMG_20140717_135705.jpg" /> +<img alt="嗯,就是的" src="http://tulparblog.qiniudn.com/lifeIMG_20140717_135934.jpg" /></p>WonWed, 16 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-16:hui-jia-lu.html我爱我家格式化字符串——时间http://wbowam.github.io/ge-shi-hua-zi-fu-chuan-shi-jian.html<p>之前介绍过<a href="http://tulpar008.github.io/ben-ban-fa-xue-python.html">格式化字符串</a> <br /> +本篇专门介绍格式化字符串——时间 </p> +<hr /> +<p>所有日期、时间的api都在datetime模块内。</p> +<h5 id="1-datetime-string">1. datetime =&gt; string<a class="headerlink" href="#1-datetime-string" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">()</span> +<span class="n">now</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +<span class="err">输出</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">05</span> <span class="mi">16</span><span class="o">:</span><span class="mi">26</span><span class="o">:</span><span class="mf">23.870105</span> +</pre></div> + + +<p>strftime是datetime类的实例方法。</p> +<h5 id="2-string-datetime">2. string =&gt; datetime<a class="headerlink" href="#2-string-datetime" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">t_str</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">05</span> <span class="mi">16</span><span class="o">:</span><span class="mi">26</span><span class="o">:</span><span class="mi">23</span><span class="err">&#39;</span> +<span class="n">d</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">t_str</span><span class="p">,</span> <span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>strptime是datetime类的静态方法。</p> +<h5 id="_1">有关时间的更多格式化字符串:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="c">%a Abbreviated weekday name</span> +<span class="c">%A Full weekday name</span> +<span class="c">%b Abbreviated month name</span> +<span class="c">%B Full month name</span> +<span class="c">%c Date and time representation appropriate for locale</span> +<span class="c">%d Day of month as decimal number (01 - 31)</span> +<span class="c">%H Hour in 24-hour format (00 - 23)</span> +<span class="c">%I Hour in 12-hour format (01 - 12)</span> +<span class="c">%j Day of year as decimal number (001 - 366)</span> +<span class="c">%m Month as decimal number (01 - 12)</span> +<span class="c">%M Minute as decimal number (00 - 59)</span> +<span class="c">%p Current locale&#39;s A.M./P.M. indicator for 12-hour clock</span> +<span class="c">%S Second as decimal number (00 - 59)</span> +<span class="c">%U Week of year as decimal number, with Sunday as first day of week (00 - 51)</span> +<span class="c">%w Weekday as decimal number (0 - 6; Sunday is 0)</span> +<span class="c">%W Week of year as decimal number, with Monday as first day of week (00 - 51)</span> +<span class="c">%x Date representation for current locale</span> +<span class="c">%X Time representation for current locale</span> +<span class="c">%y Year without century, as decimal number (00 - 99)</span> +<span class="c">%Y Year with century, as decimal number</span> +<span class="c">%z, %Z Time-zone name or abbreviation; no characters if time zone is unknown</span> +<span class="c">%% Percent sign</span> +</pre></div>WonTue, 08 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-08:ge-shi-hua-zi-fu-chuan-shi-jian.htmlPythonPython时间操作http://wbowam.github.io/pythonshi-jian-cao-zuo.html<p>所有日期、时间的api都在datetime模块内。 <br /> +参考<a href="http://tulpar008.github.io/ge-shi-hua-zi-fu-chuan-shi-jian.html">时间格式化字符串</a></p> +<h3 id="1-datetime-string">1. datetime =&gt; string<a class="headerlink" href="#1-datetime-string" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">()</span> +<span class="n">now</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +<span class="err">输出</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">05</span> <span class="mi">16</span><span class="o">:</span><span class="mi">26</span><span class="o">:</span><span class="mf">23.870105</span> +</pre></div> + + +<p>strftime是datetime类的实例方法。</p> +<h3 id="2-string-datetime">2. string =&gt; datetime<a class="headerlink" href="#2-string-datetime" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">t_str</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">05</span> <span class="mi">16</span><span class="o">:</span><span class="mi">26</span><span class="o">:</span><span class="mi">23</span><span class="err">&#39;</span> +<span class="n">d</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">t_str</span><span class="p">,</span> <span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>strptime是datetime类的静态方法。</p> +<h3 id="3">3.时间的比较<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3> +<h5 id="datetimetimedelta">在datetime模块中有timedelta类,这个类的对象用于表示一个时间间隔,比如两个日期或者时间的差别。<a class="headerlink" href="#datetimetimedelta" title="Permanent link">&para;</a></h5> +<p>构造方法: </p> +<div class="highlight"><pre><span class="n">datetime</span><span class="p">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">seconds</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">microseconds</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">milliseconds</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">minutes</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">hours</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">weeks</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> +</pre></div> + + +<p>所有的参数都有默认值0,这些参数可以是int或float,正的或负的。 </p> +<p>可以通过timedelta.days、tiemdelta.seconds等获取相应的时间值。</p> +<h5 id="_1">通过这个类可以很方便的实现一些功能,如<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<ol> +<li>两个日期相差多少。</li> +</ol> +<div class="highlight"><pre><span class="n">d1</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">strptime</span><span class="p">(</span><span class="err">&#39;</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">05</span> <span class="mi">17</span><span class="o">:</span><span class="mi">41</span><span class="o">:</span><span class="mi">20</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">d2</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">strptime</span><span class="p">(</span><span class="err">&#39;</span><span class="mi">2012</span><span class="o">-</span><span class="mo">03</span><span class="o">-</span><span class="mo">02</span> <span class="mi">17</span><span class="o">:</span><span class="mi">41</span><span class="o">:</span><span class="mi">20</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">delta</span> <span class="o">=</span> <span class="n">d1</span> <span class="o">-</span> <span class="n">d2</span> +<span class="n">print</span> <span class="n">delta</span><span class="p">.</span><span class="n">days</span> +<span class="n">print</span> <span class="n">delta</span><span class="p">.</span><span class="n">hours</span> +</pre></div> + + +<p>输出:<code>3 72</code></p> +<ol> +<li>今天的n天后的日期。</li> +</ol> +<div class="highlight"><pre><span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">()</span> +<span class="n">delta</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span> +<span class="n">n_days</span> <span class="o">=</span> <span class="n">now</span> <span class="o">+</span> <span class="n">delta</span> +<span class="n">print</span> <span class="n">n_days</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="err">&#39;</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">d</span> <span class="o">%</span><span class="n">H</span><span class="o">:%</span><span class="n">M</span><span class="o">:%</span><span class="n">S</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<p>输出:<code>2012-03-08 17:44:50</code></p>WonTue, 08 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-08:pythonshi-jian-cao-zuo.htmlPythonPython中raw_input和input的异同点http://wbowam.github.io/pythonzhong-raw_inputhe-inputde-yi-tong-dian.html<p>一般软件做的事情主要就是下面几条:<br /> +· 接受人的输入。 <br /> +· 改变输入。 <br /> +· 打印出改变了的输入 <br /> + ———来自&lt;<a href="http://tulpar008.github.io/ben-ban-fa-xue-python.html">笨办法学Python</a>&gt;</p> +<hr /> +<h3 id="_1">相同点<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>这两个函数均用来接收输入,上述真理已足以说明它们的重要性,我不赘述了。</p> +<h3 id="_2">不同点<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p><strong>1. raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收)。而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它会引发一个 SyntaxError 。</strong></p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span><span class="n">a</span><span class="o">=</span><span class="nx">raw_input</span><span class="p">(</span><span class="s2">&quot;请输入字符串,不用写引号:&quot;</span><span class="p">)</span> +<span class="err">请输入字符串,不用写引号:</span><span class="nx">guoshu</span> + +<span class="o">&gt;&gt;&gt;</span><span class="n">b</span><span class="o">=</span><span class="nb">input</span><span class="p">(</span><span class="s2">&quot;请输入字符串,不写引号试试:&quot;</span><span class="p">)</span> +<span class="err">请输入字符串,不写引号试试:</span><span class="nx">guoshu</span> + +<span class="nx">Traceback</span> <span class="p">(</span><span class="nx">most</span> <span class="nx">recent</span> <span class="nb">call</span> <span class="nb">last</span><span class="p">):</span> + <span class="nb">File</span> <span class="s2">&quot;&lt;pyshell#1&gt;&quot;</span><span class="p">,</span> <span class="nb">line</span> <span class="mi">1</span><span class="p">,</span> <span class="k">in</span> <span class="o">&lt;</span><span class="nx">module</span><span class="o">&gt;</span> + <span class="n">input_A</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&quot;Input: &quot;</span><span class="p">)</span> + <span class="nb">File</span> <span class="s2">&quot;&lt;string&gt;&quot;</span><span class="p">,</span> <span class="nb">line</span> <span class="mi">1</span><span class="p">,</span> <span class="k">in</span> <span class="o">&lt;</span><span class="nx">module</span><span class="o">&gt;</span> +<span class="nx">NameError</span><span class="p">:</span> <span class="nb">name</span> <span class="s1">&#39;guoshu&#39;</span> <span class="nx">is</span> <span class="ow">not</span> <span class="nx">defined</span> + +<span class="o">&gt;&gt;&gt;</span><span class="n">c</span><span class="o">=</span><span class="nb">input</span><span class="p">(</span><span class="s2">&quot;请输入字符串,必须写引号:&quot;</span><span class="p">)</span> +<span class="err">请输入字符串,必须写引号:</span><span class="nx">guoshu</span> +</pre></div> + + +<p><strong>2. raw_input() 将所有输入作为字符串看待,返回字符串类型。而input() 可接受合法的 python 表达式,包括数字,字符串(有引号才算合法的字符串表达式),其他(如1+2)。</strong></p> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span><span class="n">d1</span><span class="o">=</span><span class="n">raw_input</span><span class="p">(</span><span class="s">&quot;raw_input输入数字时:&quot;</span> +<span class="n">raw_input</span><span class="err">输入数字时:</span><span class="mi">123</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">type</span><span class="p">(</span><span class="n">d1</span><span class="p">)</span> +<span class="o">&lt;</span><span class="n">type</span> <span class="err">&#39;</span><span class="n">str</span><span class="err">&#39;</span><span class="o">&gt;</span> + +<span class="o">&gt;&gt;&gt;</span><span class="n">d2</span><span class="o">=</span><span class="n">input</span><span class="p">(</span><span class="s">&quot;input输入数字时:&quot;</span><span class="p">)</span> +<span class="n">input</span><span class="err">输入数字时:</span><span class="mi">123</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">type</span><span class="p">(</span><span class="n">d2</span><span class="p">)</span> +<span class="o">&lt;</span><span class="n">type</span> <span class="err">&#39;</span><span class="kt">int</span><span class="err">&#39;</span><span class="o">&gt;</span> + +<span class="o">&gt;&gt;&gt;</span><span class="n">e1</span><span class="o">=</span><span class="n">raw_input</span><span class="p">(</span><span class="s">&quot;raw_input输入表达式时:&quot;</span> +<span class="n">raw_input</span><span class="err">输入表达式时:</span><span class="mi">3</span><span class="o">+</span><span class="mi">2</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">type</span><span class="p">(</span><span class="n">e1</span><span class="p">)</span> +<span class="o">&lt;</span><span class="n">type</span> <span class="err">&#39;</span><span class="n">str</span><span class="err">&#39;</span><span class="o">&gt;</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">e1</span> +<span class="err">&#39;</span><span class="mi">3</span><span class="o">+</span><span class="mi">2</span><span class="err">&#39;</span> + +<span class="o">&gt;&gt;&gt;</span><span class="n">e2</span><span class="o">=</span><span class="n">input</span><span class="p">(</span><span class="s">&quot;input输入表达式时:&quot;</span> +<span class="n">input</span><span class="err">输入表达式时:</span><span class="mi">3</span><span class="o">+</span><span class="mi">2</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">type</span><span class="p">(</span><span class="n">e2</span><span class="p">)</span> +<span class="o">&lt;</span><span class="n">type</span> <span class="err">&#39;</span><span class="kt">int</span><span class="err">&#39;</span><span class="o">&gt;</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">e2</span> +<span class="mi">5</span> +</pre></div> + + +<h3 id="_3">看看文档时怎么说滴:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="nx">input</span><span class="p">(</span><span class="cp">[</span><span class="nx">prompt</span><span class="cp">]</span><span class="p">)</span> +<span class="o">*</span> <span class="nx">Equivalent</span> <span class="nx">to</span> <span class="nb">eval</span><span class="p">(</span><span class="nx">raw_input</span><span class="p">(</span><span class="nx">prompt</span><span class="p">)).</span> + +<span class="o">*</span> <span class="nx">This</span> <span class="kd">function</span> <span class="nx">does</span> <span class="nx">not</span> <span class="k">catch</span> <span class="nx">user</span> <span class="nx">errors</span><span class="p">.</span> <span class="nx">If</span> <span class="nx">the</span> <span class="nx">input</span> <span class="nx">is</span> <span class="nx">not</span> <span class="nx">syntactically</span> <span class="nx">valid</span><span class="p">,</span> <span class="nx">a</span> <span class="nx">SyntaxError</span> <span class="nx">will</span> <span class="nx">be</span> <span class="nx">raised</span><span class="p">.</span> <span class="nx">Other</span> <span class="nx">exceptions</span> <span class="nx">may</span> <span class="nx">be</span> <span class="nx">raised</span> <span class="k">if</span> <span class="nx">there</span> <span class="nx">is</span> <span class="nx">an</span> <span class="nx">error</span> <span class="nx">during</span> <span class="nx">evaluation</span><span class="p">.</span> + +<span class="o">*</span> <span class="nx">If</span> <span class="nx">the</span> <span class="nx">readline</span> <span class="nx">module</span> <span class="nx">was</span> <span class="nx">loaded</span><span class="p">,</span> <span class="nx">then</span> <span class="nx">input</span><span class="p">()</span> <span class="nx">will</span> <span class="nx">use</span> <span class="nx">it</span> <span class="nx">to</span> <span class="nx">provide</span> <span class="nx">elaborate</span> <span class="nx">line</span> <span class="nx">editing</span> <span class="nx">and</span> <span class="nx">history</span> <span class="nx">features</span><span class="p">.</span> + +<span class="o">*</span> <span class="nx">Consider</span> <span class="nx">using</span> <span class="nx">the</span> <span class="nx">raw_input</span><span class="p">()</span> <span class="kd">function</span> <span class="k">for</span> <span class="nx">general</span> <span class="nx">input</span> <span class="nx">from</span> <span class="nx">users</span><span class="p">.</span> +</pre></div> + + +<h5 id="_4">第一点<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h5> +<p>input() 本质上还是使用 raw_input() 来实现的,只是调用完 raw_input() 之后再调用 <a href="http://tulpar008.github.io/python-exeche-evalyu-ju.html">eval() 函数</a>。</p> +<h5 id="_5">第四点<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h5> +<p>除非对 input() 有特别需要,否则一般情况下我们都是推荐使用 raw_input() 来与用户交互。</p>WonTue, 08 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-08:pythonzhong-raw_inputhe-inputde-yi-tong-dian.htmlPython__init__()方法http://wbowam.github.io/__init__fang-fa.html<h3 id="__">首先复习一下,<a href="http://tulpar008.github.io/pythonzhong-__shuang-xia-hua-xian-de-zuo-yong.html">__(双下划线)的作用</a><a class="headerlink" href="#__" title="Permanent link">&para;</a></h3> +<ul> +<li> +<p>Python中默认的成员函数,成员变量都是公开的(public),而且python中没有类似public,private等关键词来修饰成员函数,成员变量。 </p> +</li> +<li> +<p>可有时候需要用到私有变量,因此诞生了__。 </p> +</li> +<li> +<p>变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就会为私有的了。</p> +</li> +<li> +<p>私有意味着只有内部能使用,对外部隐藏。 </p> +</li> +<li> +<p>在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername来使用。 <br /> +在外部,使用原来的私有成员的名字时,会提示找不到。(达到了隐藏的效果) </p> +</li> +</ul> +<hr /> +<p>很显然,__init__是个私有函数</p> +<h5 id="__init__">__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。<a class="headerlink" href="#__init__" title="Permanent link">&para;</a></h5> +<h6 id="_1">注意,这个名称的开始和结尾都是双下划线。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h6>WonMon, 07 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-07:__init__fang-fa.htmlPythondjango 分页http://wbowam.github.io/django-fen-ye.html<p>我个人使用gmail的邮件服务器,不过经常会被墙,因此下面讲解使用qq邮箱服务器。</p> +<ol> +<li>首先看看django-pagination</li> +</ol> +<hr /> +<h4 id="settingspy">settings.py<a class="headerlink" href="#settingspy" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">TEMPLATE_CONTEXT_PROCESSORS</span> <span class="o">=</span> <span class="p">(</span> +<span class="s">&quot;django.contrib.auth.context_processors.auth&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.debug&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.i18n&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.media&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.static&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.tz&quot;</span><span class="p">,</span> +<span class="s">&quot;django.core.context_processors.request&quot;</span><span class="p">,)</span> + +<span class="n">MIDDLEWARE_CLASSES</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">common</span><span class="p">.</span><span class="n">CommonMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sessions</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">SessionMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">csrf</span><span class="p">.</span><span class="n">CsrfViewMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">AuthenticationMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">messages</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">MessageMiddleware</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">pagination</span><span class="p">.</span><span class="n">middleware</span><span class="p">.</span><span class="n">PaginationMiddleware</span><span class="err">&#39;</span><span class="p">,</span> +<span class="p">)</span> +<span class="n">INSTALLED_APPS</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">contenttypes</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sessions</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sites</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">messages</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">staticfiles</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">admin</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">admindocs</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">photologue</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">pagination</span><span class="err">&#39;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<h4 id="template">template<a class="headerlink" href="#template" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="p">{</span><span class="o">%</span> <span class="nx">load</span> <span class="nx">pagination_tags</span> <span class="o">%</span><span class="p">}</span> +<span class="p">{</span><span class="o">%</span> <span class="nx">autopaginate</span> <span class="nx">articles_list</span> <span class="mi">9</span> <span class="o">%</span><span class="p">}</span> +<span class="o">&lt;</span><span class="nx">ul</span><span class="o">&gt;</span> + <span class="p">{</span><span class="o">%</span> <span class="nb">for</span> <span class="n">item</span> <span class="k">in</span> <span class="nx">articles_list</span> <span class="o">%</span><span class="p">}</span> + <span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;</span> + <span class="o">&lt;</span><span class="nx">span</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="n">href</span><span class="o">=</span><span class="s2">&quot;#&quot;</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot;icon-thumbs-up&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">a</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="n">href</span><span class="o">=</span><span class="s2">&quot;#&quot;</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot; icon-thumbs-down&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">a</span><span class="o">&gt;&lt;/</span><span class="nx">span</span><span class="o">&gt;</span> + <span class="o">&lt;</span><span class="nb">div</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot;list-title&quot;</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="n">href</span><span class="o">=</span><span class="s2">&quot;#&quot;</span><span class="o">&gt;</span><span class="p">{{</span> <span class="nx">item.title</span> <span class="o">|</span> <span class="nx">slice</span><span class="p">:</span><span class="s2">&quot;15&quot;</span> <span class="p">}}</span><span class="o">&lt;/</span><span class="nx">a</span><span class="o">&gt;&lt;/</span><span class="nb">div</span><span class="o">&gt;</span> + + <span class="o">&lt;</span><span class="nb">img</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot;thumbnail&quot;</span> <span class="n">src</span><span class="o">=</span><span class="s2">&quot;/media/{{ item.title_image }}&quot;</span><span class="o">&gt;&lt;</span><span class="nx">p</span><span class="o">&gt;</span><span class="p">{{</span> <span class="nx">item.title_image</span> <span class="p">}}</span> + <span class="p">{{</span> <span class="nx">item.summary</span> <span class="o">|</span> <span class="nx">slice</span><span class="p">:</span><span class="s2">&quot;150&quot;</span><span class="p">}}</span><span class="o">&lt;/</span><span class="nx">p</span><span class="o">&gt;</span> + <span class="o">&lt;</span><span class="nb">div</span> <span class="n">class</span><span class="o">=</span><span class="s2">&quot;circle&quot;</span><span class="o">&gt;&lt;</span><span class="nb">div</span><span class="o">&gt;&lt;/</span><span class="nb">div</span><span class="o">&gt;&lt;</span><span class="nb">div</span><span class="o">&gt;&lt;/</span><span class="nb">div</span><span class="o">&gt;&lt;</span><span class="nb">div</span><span class="o">&gt;&lt;/</span><span class="nb">div</span><span class="o">&gt;&lt;/</span><span class="nb">div</span><span class="o">&gt;</span> + <span class="o">&lt;/</span><span class="nx">li</span><span class="o">&gt;</span> + <span class="p">{</span><span class="o">%</span> <span class="nx">endfor</span> <span class="o">%</span><span class="p">}</span> + <span class="p">{</span><span class="o">%</span> <span class="nx">paginate</span> <span class="o">%</span><span class="p">}</span> + <span class="o">&lt;/</span><span class="nx">ul</span><span class="o">&gt;</span> +</pre></div> + + +<h4 id="_1">定制<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<h5 id="_2">美化什么的好弄<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h5> +<h5 id="_3">翻译<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h5> +<ol> +<li>直接入侵式修改(强烈不推荐)</li> +<li>把pagination.html复制到本地template目录,然后再<a href="http://tulpar008.github.io/django-guo-ji-hua.html">翻译</a> <br /> + pagination.html在<code>(环境目录)/lib/sitepackages/pagination/templates/paginaion.html</code></li> +</ol>WonMon, 07 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-07:django-fen-ye.htmlDjangoDjango 使用邮件服务http://wbowam.github.io/django-shi-yong-you-jian-fu-wu.html<p>我个人使用gmail的邮件服务器,不过经常会被墙,因此下面讲解使用qq邮箱服务器。</p> +<hr /> +<h3 id="django-settingspy">django settings.py<a class="headerlink" href="#django-settingspy" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">DEFAULT_FROM_EMAIL</span><span class="o">=</span><span class="err">&#39;</span><span class="mi">49244564</span><span class="err">@</span><span class="n">qq</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="cp">#django 要求这里的“发送者”邮箱必须和超级管理员的邮箱一致,而且不能为空</span> +<span class="n">EMAIL_USE_TLS</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">EMAIL_HOST</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">smtp</span><span class="p">.</span><span class="n">qq</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">EMAIL_PORT</span> <span class="o">=</span> <span class="mi">587</span> +<span class="cp">##此处用的是SMTP的SSL加密方式,所以使用587或465端口号,不然可以用25端口。</span> +<span class="n">EMAIL_HOST_USER</span> <span class="o">=</span> <span class="err">&#39;</span><span class="mi">49244564</span><span class="err">@</span><span class="n">qq</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">EMAIL_HOST_PASSWORD</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">wodeqqyouxiangmima</span><span class="err">&#39;</span> +</pre></div> + + +<h3 id="qqsmtp">开启qq邮箱SMTP服务<a class="headerlink" href="#qqsmtp" title="Permanent link">&para;</a></h3> +<p>设置——账户——开启服务————打勾“POP3/SMTP服务和IMAP/SMTP服务“ </p>WonMon, 07 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-07:django-shi-yong-you-jian-fu-wu.htmlDjangoinit__()方法http://wbowam.github.io/init__fang-fa.html<h3 id="__">首先复习一下,<a href="http://tulpar008.github.io/pythonzhong-__shuang-xia-hua-xian-de-zuo-yong.html">__(双下划线)的作用</a><a class="headerlink" href="#__" title="Permanent link">&para;</a></h3> +<ul> +<li> +<p>Python中默认的成员函数,成员变量都是公开的(public),而且python中没有类似public,private等关键词来修饰成员函数,成员变量。 </p> +</li> +<li> +<p>可有时候需要用到私有变量,因此诞生了__。 </p> +</li> +<li> +<p>变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就会为私有的了。</p> +</li> +<li> +<p>私有意味着只有内部能使用,对外部隐藏。 </p> +</li> +<li> +<p>在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername来使用。 <br /> +在外部,使用原来的私有成员的名字时,会提示找不到。(达到了隐藏的效果) </p> +</li> +</ul> +<hr /> +<p>很显然,__init__是个私有函数</p> +<h5 id="__init__">__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。<a class="headerlink" href="#__init__" title="Permanent link">&para;</a></h5> +<h6 id="_1">注意,这个名称的开始和结尾都是双下划线。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h6>WonMon, 07 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-07:init__fang-fa.htmlPythonpython 实例方法,静态方法,类方法http://wbowam.github.io/python-shi-li-fang-fa-jing-tai-fang-fa-lei-fang-fa.html<h3 id="_1">实例方法(@郭叔)<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>字面意思:实例的方法,即只有实例能使用的方法,相对于类方法和静态方法。</p> +<h5 id="self">实例方法的第一个参数默认为self,代指实例。<a class="headerlink" href="#self" title="Permanent link">&para;</a></h5> +<p>如:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Foo</span><span class="o">:</span> + <span class="err">##</span><span class="n">init</span><span class="p">()</span><span class="err">是生成实例时默认调用的实例方法</span><span class="p">,</span><span class="err">用于初始化详细见</span><span class="p">[</span><span class="n">__init__</span><span class="err">方法</span><span class="p">](</span><span class="err">#</span><span class="p">)</span> + <span class="err">###第一个参数默认为</span><span class="n">self</span> + <span class="n">def</span> <span class="n">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span><span class="o">:</span> + <span class="n">self</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> + <span class="n">self</span><span class="p">.</span><span class="n">author</span><span class="o">=</span><span class="s">&quot;Tulpar&quot;</span> + <span class="err">##又一个实例方法</span> + <span class="n">def</span> <span class="n">hi</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="n">print</span> <span class="n">self</span><span class="p">.</span><span class="n">name</span> + <span class="n">print</span> <span class="s">&quot;Created by %s&quot;</span><span class="o">%</span><span class="n">self</span><span class="p">.</span><span class="n">author</span> +</pre></div> + + +<h5 id="selfguoshu">self不是一个关键字,而是约定的写法。也可以换成任意字符串,如'guoshu'<a class="headerlink" href="#selfguoshu" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre> <span class="err">###第一个参数默认为</span><span class="n">guoshu</span><span class="p">,</span><span class="err">作用和</span><span class="n">self</span><span class="err">一样</span> + <span class="n">def</span> <span class="n">__init__</span><span class="p">(</span><span class="n">guoshu</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span><span class="o">:</span> + <span class="n">guoshu</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> + <span class="n">guoshu</span><span class="p">.</span><span class="n">author</span><span class="o">=</span><span class="s">&quot;Tulpar&quot;</span> + <span class="err">##又一个实例方法</span> + <span class="n">def</span> <span class="n">hi</span><span class="p">(</span><span class="n">guoshu</span><span class="p">)</span><span class="o">:</span> + <span class="n">print</span> <span class="n">guoshu</span><span class="p">.</span><span class="n">name</span> + <span class="n">print</span> <span class="s">&quot;Created by %s&quot;</span><span class="o">%</span><span class="n">guoshu</span><span class="p">.</span><span class="n">author</span> +</pre></div> + + +<h3 id="_2">静态方法<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p>静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Foo</span><span class="o">:</span> + <span class="err">##静态方法走起</span> + <span class="err">@</span><span class="n">staticmethod</span> + <span class="n">def</span> <span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span><span class="o">:</span> + <span class="n">print</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> +</pre></div> + + +<p>运行结果</p> +<div class="highlight"><pre><span class="cp">###生成实例f1</span> +<span class="o">&gt;</span><span class="n">f1</span><span class="o">=</span><span class="n">Foo</span><span class="p">(</span><span class="n">u</span><span class="err">&#39;果树&#39;</span><span class="p">)</span> +<span class="cp">###实例能用静态方法</span> +<span class="o">&gt;</span><span class="n">f1</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span> +<span class="cp">###类对象也能使用静态方法</span> +<span class="o">&gt;</span><span class="n">Foo</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span> +<span class="cp">###输出结果</span> +<span class="mi">8</span> +<span class="mi">8</span> +</pre></div> + + +<h3 id="_3">类方法<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<p>正在更新!!</p>WonMon, 07 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-07:python-shi-li-fang-fa-jing-tai-fang-fa-lei-fang-fa.htmlPythonpython中 __(双下划线)的作用http://wbowam.github.io/pythonzhong-__shuang-xia-hua-xian-de-zuo-yong.html<ul> +<li> +<p>Python中默认的成员函数,成员变量都是公开的(public),而且python中没有类似public,private等关键词来修饰成员函数,成员变量。 </p> +</li> +<li> +<p>可有时候需要用到私有变量,因此诞生了__。 </p> +</li> +<li> +<p>变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就会为私有的了。</p> +</li> +<li> +<p>私有意味着只有内部能使用,对外部隐藏。 </p> +</li> +<li> +<p>在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername来使用。 <br /> +在外部,使用原来的私有成员的名字时,会提示找不到。(达到了隐藏的效果) </p> +</li> +</ul> +<hr /> +<div class="highlight"><pre><span class="n">class</span> <span class="n">Tester</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">__foo</span> <span class="o">=</span> <span class="s">&quot;hi&quot;</span> + +<span class="o">&gt;&gt;&gt;</span> <span class="n">t</span> <span class="o">=</span> <span class="n">Tester</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">t</span><span class="p">.</span><span class="n">_Tester__foo</span> +<span class="err">&#39;</span><span class="n">hi</span><span class="err">&#39;</span> +</pre></div> + + +<div class="highlight"><pre><span class="n">class</span> <span class="n">Tester</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> +<span class="p">...</span> <span class="n">def</span> <span class="n">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> +<span class="p">...</span> <span class="n">self</span><span class="p">.</span><span class="n">__foo</span> <span class="o">=</span> <span class="s">&quot;hi&quot;</span> +<span class="p">...</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">t</span><span class="o">=</span><span class="n">Tester</span><span class="p">()</span> +<span class="o">&gt;&gt;&gt;</span><span class="n">t</span><span class="p">.</span><span class="n">_Tester__foo</span> +<span class="err">&#39;</span><span class="n">hi</span><span class="err">&#39;</span> +</pre></div>WonMon, 07 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-07:pythonzhong-__shuang-xia-hua-xian-de-zuo-yong.htmlPythonPython with语句http://wbowam.github.io/python-withyu-ju.html<p>感谢<a href="http://sdqali.in/blog/2012/07/09/understanding-pythons-with/">Sadique Ali</a>的总结分享</p> +<h3 id="with">With语句是什么?<a class="headerlink" href="#with" title="Permanent link">&para;</a></h3> +<p>有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。 <br /> +一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。</p> +<p>如果不用with语句,代码如下:</p> +<div class="highlight"><pre><span class="n">file</span> <span class="o">=</span> <span class="n">open</span><span class="p">(</span><span class="s">&quot;/tmp/foo.txt&quot;</span><span class="p">)</span> +<span class="n">data</span> <span class="o">=</span> <span class="n">file</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> +<span class="n">file</span><span class="p">.</span><span class="n">close</span><span class="p">()</span> +</pre></div> + + +<p>这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是处理异常的加强版本:</p> +<div class="highlight"><pre><span class="n">file</span> <span class="o">=</span> <span class="n">open</span><span class="p">(</span><span class="s">&quot;/tmp/foo.txt&quot;</span><span class="p">)</span> +<span class="nl">try:</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">file</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> +<span class="nl">finally:</span> + <span class="n">file</span><span class="p">.</span><span class="n">close</span><span class="p">()</span> +</pre></div> + + +<p>虽然这段代码运行良好,但是太冗长了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:</p> +<div class="highlight"><pre><span class="n">with</span> <span class="n">open</span><span class="p">(</span><span class="s">&quot;/tmp/foo.txt&quot;</span><span class="p">)</span> <span class="n">as</span> <span class="n">file</span><span class="o">:</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">file</span><span class="p">.</span><span class="n">read</span><span class="p">()</span> +</pre></div> + + +<h3 id="with_1">with如何工作?<a class="headerlink" href="#with_1" title="Permanent link">&para;</a></h3> +<p>这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。 </p> +<p>紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。</p> +<p>下面例子可以具体说明with如何工作:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span> +<span class="c"># with_example01.py</span> + + +<span class="k">class</span> <span class="nc">Sample</span><span class="p">:</span> + <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="k">print</span> <span class="s">&quot;In __enter__()&quot;</span> + <span class="k">return</span> <span class="s">&quot;Foo&quot;</span> + + <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">trace</span><span class="p">):</span> + <span class="k">print</span> <span class="s">&quot;In __exit__()&quot;</span> + + +<span class="k">def</span> <span class="nf">get_sample</span><span class="p">():</span> + <span class="k">return</span> <span class="n">Sample</span><span class="p">()</span> + + +<span class="k">with</span> <span class="n">get_sample</span><span class="p">()</span> <span class="k">as</span> <span class="n">sample</span><span class="p">:</span> + <span class="k">print</span> <span class="s">&quot;sample:&quot;</span><span class="p">,</span> <span class="n">sample</span> +</pre></div> +</td></tr></table> + +<p>运行代码,输出如下</p> +<div class="highlight"><pre><span class="n">bash</span><span class="o">-</span><span class="mf">3.2</span><span class="err">$</span> <span class="p">.</span><span class="o">/</span><span class="n">with_example01</span><span class="p">.</span><span class="n">py</span> +<span class="n">In</span> <span class="n">__enter__</span><span class="p">()</span> +<span class="nl">sample:</span> <span class="n">Foo</span> +<span class="n">In</span> <span class="n">__exit__</span><span class="p">()</span> +</pre></div> + + +<p>正如你看到的, </p> +<div class="highlight"><pre><span class="mf">1.</span> <span class="n">__enter__</span><span class="p">()</span><span class="err">方法被执行</span> +<span class="mf">2.</span> <span class="n">__enter__</span><span class="p">()</span><span class="err">方法返回的值</span> <span class="o">-</span> <span class="err">这个例子中是</span><span class="s">&quot;Foo&quot;</span><span class="err">,赋值给变量&#39;</span><span class="n">sample</span><span class="err">&#39;</span> +<span class="mf">3.</span> <span class="err">执行代码块,打印变量</span><span class="s">&quot;sample&quot;</span><span class="err">的值为</span> <span class="s">&quot;Foo&quot;</span> +<span class="mf">4.</span> <span class="n">__exit__</span><span class="p">()</span><span class="err">方法被调用</span> +</pre></div> + + +<p>with真正强大之处是它可以处理异常。可能你已经注意到Sample类的__exit__方法有三个参数- val, type 和 trace。 这些参数在异常处理中相当有用。我们来改一下代码,看看具体如何工作的。</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span> +<span class="c"># with_example02.py</span> + + +<span class="k">class</span> <span class="nc">Sample</span><span class="p">:</span> + <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="k">return</span> <span class="bp">self</span> + + <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">trace</span><span class="p">):</span> + <span class="k">print</span> <span class="s">&quot;type:&quot;</span><span class="p">,</span> <span class="nb">type</span> + <span class="k">print</span> <span class="s">&quot;value:&quot;</span><span class="p">,</span> <span class="n">value</span> + <span class="k">print</span> <span class="s">&quot;trace:&quot;</span><span class="p">,</span> <span class="n">trace</span> + + <span class="k">def</span> <span class="nf">do_something</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="n">bar</span> <span class="o">=</span> <span class="mi">1</span><span class="o">/</span><span class="mi">0</span> + <span class="k">return</span> <span class="n">bar</span> <span class="o">+</span> <span class="mi">10</span> + +<span class="k">with</span> <span class="n">Sample</span><span class="p">()</span> <span class="k">as</span> <span class="n">sample</span><span class="p">:</span> + <span class="n">sample</span><span class="o">.</span><span class="n">do_something</span><span class="p">()</span> +</pre></div> +</td></tr></table> + +<p>这个例子中,with后面的get_sample()变成了Sample()。这没有任何关系,只要紧跟with后面的语句所返回的对象有__enter__()和__exit__()方法即可。此例中,Sample()的__enter__()方法返回新创建的Sample对象,并赋值给变量sample。 </p> +<p>代码执行后:</p> +<div class="highlight"><pre><span class="nx">bash</span><span class="o">-</span><span class="mf">3.2</span><span class="err">$</span> <span class="nx">.</span><span class="p">/</span><span class="nx">with_example02.py</span> +<span class="k">type</span><span class="p">:</span> <span class="o">&lt;</span><span class="k">type</span> <span class="s1">&#39;exceptions.ZeroDivisionError&#39;</span><span class="o">&gt;</span> +<span class="nb">value</span><span class="p">:</span> <span class="kt">integer</span> <span class="nx">division</span> <span class="ow">or</span> <span class="nx">modulo</span> <span class="k">by</span> <span class="nx">zero</span> +<span class="nb">trace</span><span class="p">:</span> <span class="o">&lt;</span><span class="nx">traceback</span> <span class="nb">object</span> <span class="nx">at</span> <span class="mh">0x1004a8128</span><span class="o">&gt;</span> +<span class="nx">Traceback</span> <span class="p">(</span><span class="nx">most</span> <span class="nx">recent</span> <span class="nb">call</span> <span class="nb">last</span><span class="p">):</span> + <span class="nb">File</span> <span class="s2">&quot;./with_example02.py&quot;</span><span class="p">,</span> <span class="nb">line</span> <span class="mi">19</span><span class="p">,</span> <span class="k">in</span> <span class="o">&lt;</span><span class="nx">module</span><span class="o">&gt;</span> + <span class="nx">sample.do_something</span><span class="p">()</span> + <span class="nb">File</span> <span class="s2">&quot;./with_example02.py&quot;</span><span class="p">,</span> <span class="nb">line</span> <span class="mi">15</span><span class="p">,</span> <span class="k">in</span> <span class="nx">do_something</span> + <span class="n">bar</span> <span class="o">=</span> <span class="mi">1</span><span class="p">/</span><span class="nx">0</span> +<span class="nx">ZeroDivisionError</span><span class="p">:</span> <span class="kt">integer</span> <span class="nx">division</span> <span class="ow">or</span> <span class="nx">modulo</span> <span class="k">by</span> <span class="nx">zero</span> +</pre></div> + + +<p>实际上,在with后面的代码块抛出任何异常时,<strong>exit</strong>()方法被执行。正如例子所示,异常抛出时,与之关联的type,value和stack trace传给__exit__()方法,因此抛出的ZeroDivisionError异常被打印出来了。开发库时,清理资源,关闭文件等等操作,都可以放在__exit__方法当中。</p> +<p>因此,Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。 </p>WonThu, 03 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-03:python-withyu-ju.htmlPythonpython exec和eval语句http://wbowam.github.io/python-exeche-evalyu-ju.html<h5 id="execpythonpythonexec">exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。下面是一个简单的例子。<a class="headerlink" href="#execpythonpythonexec" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">exec</span> <span class="err">&#39;</span><span class="n">print</span> <span class="s">&quot;Hello World&quot;</span><span class="err">&#39;</span> +<span class="n">Hello</span> <span class="n">World</span> +</pre></div> + + +<h6 id="evalpython">eval语句用来计算存储在字符串中的有效Python表达式。下面是一个简单的例子。<a class="headerlink" href="#evalpython" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">eval</span><span class="p">(</span><span class="err">&#39;</span><span class="mi">2</span><span class="o">*</span><span class="mi">3</span><span class="err">&#39;</span><span class="p">)</span> +<span class="mi">6</span> +</pre></div>WonWed, 02 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-02:python-exeche-evalyu-ju.htmlPythonstr()与repr()的区别http://wbowam.github.io/stryu-reprde-qu-bie.html<h5 id="_1">一<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">word</span><span class="o">=</span><span class="s">&quot;hello</span><span class="se">\t</span><span class="s"> world!</span><span class="se">\n</span><span class="s">hello motto!&quot;</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">str</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> +<span class="err">&#39;</span><span class="n">hello</span><span class="err">\</span><span class="n">t</span> <span class="n">world</span><span class="o">!</span><span class="err">\</span><span class="n">nhello</span> <span class="n">motto</span><span class="o">!</span><span class="err">&#39;</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">repr</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> +<span class="s">&quot;&#39;hello</span><span class="se">\\</span><span class="s">t world!</span><span class="se">\\</span><span class="s">nhello motto!&#39;&quot;</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">print</span> <span class="n">str</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> +<span class="n">hello</span> <span class="n">world</span><span class="o">!</span> +<span class="n">hello</span> <span class="n">motto</span><span class="o">!</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">print</span> <span class="n">repr</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> +<span class="err">&#39;</span><span class="n">hello</span><span class="err">\</span><span class="n">t</span> <span class="n">world</span><span class="o">!</span><span class="err">\</span><span class="n">nhello</span> <span class="n">motto</span><span class="o">!</span><span class="err">&#39;</span> +<span class="o">&gt;&gt;&gt;</span> +</pre></div> + + +<h5 id="_2">二<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">str</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span> +<span class="err">&#39;</span><span class="mf">0.1</span><span class="err">&#39;</span> +<span class="o">&gt;&gt;&gt;</span> <span class="n">repr</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span> +<span class="err">&#39;</span><span class="mf">0.10000000000000001</span><span class="err">&#39;</span> +</pre></div>WonTue, 01 Jul 2014 00:00:00 +0800tag:wbowam.github.io,2014-07-01:stryu-reprde-qu-bie.htmlPythonMysql语句入门(1)http://wbowam.github.io/mysqlyu-ju-ru-men-1.html<h3 id="_1">进入退出<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">mysql</span> <span class="o">-</span><span class="n">u</span> <span class="n">root</span> <span class="o">-</span><span class="n">p</span> +<span class="n">Enter</span> <span class="n">password</span><span class="o">:</span> + +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">quit</span> +</pre></div> + + +<h3 id="_2">创建数据库<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">mysql</span><span class="o">&gt;</span> <span class="n">CREATE</span> <span class="n">DATABASE</span> <span class="n">tulpar_db</span> <span class="n">CHARACTER</span> <span class="n">SET</span> <span class="n">utf8</span> <span class="n">COLLATE</span> <span class="n">utf8_general_ci</span><span class="p">;</span> + + +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">GRANT</span> <span class="n">ALL</span> <span class="n">ON</span> <span class="n">tulpar_db</span><span class="p">.</span><span class="o">*</span> <span class="n">TO</span> <span class="err">&#39;</span><span class="n">tulpar</span><span class="sc">&#39;@&#39;</span><span class="n">localhost</span><span class="err">&#39;</span> <span class="n">IDENTIFIED</span> <span class="n">BY</span> <span class="err">&#39;</span><span class="n">mypassword</span><span class="err">&#39;</span><span class="p">;</span> +</pre></div> + + +<h3 id="_3">导入数据库<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<h5 id="source">常用source 命令<a class="headerlink" href="#source" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">mysql</span><span class="o">&gt;</span><span class="n">use</span> <span class="n">tulpar_db</span> +<span class="n">mysql</span><span class="o">&gt;</span><span class="n">source</span> <span class="p">..</span><span class="o">/</span><span class="n">wcnc_db</span><span class="p">.</span><span class="n">sql</span> +</pre></div> + + +<h3 id="_4">导出整个数据库<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<p>mysqldump -u 用户名 -p 数据库名 &gt; 导出的文件名</p> +<div class="highlight"><pre><span class="n">mysqldump</span> <span class="o">-</span><span class="n">u</span> <span class="n">tulpar</span> <span class="o">-</span><span class="n">p</span> <span class="n">tulpar_db</span> <span class="o">&gt;</span> <span class="n">tulpar_db</span><span class="p">.</span><span class="n">sql</span> +</pre></div> + + +<h3 id="_5">删除数据库<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="nx">show</span> <span class="nx">databases</span><span class="p">;</span> +<span class="nx">DROP</span> <span class="nx">DATABASE</span> <span class="o">&lt;</span><span class="nb">databasename</span><span class="o">&gt;</span><span class="p">;</span> +</pre></div> + + +<h3 id="_6">删除数据表<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="nx">use</span> <span class="nx">tulpar_db</span><span class="p">;</span> +<span class="nx">show</span> <span class="nb">tables</span><span class="p">;</span> +<span class="nx">DROP</span> <span class="nb">TABLE</span> <span class="o">&lt;</span><span class="nb">tablename</span><span class="o">&gt;</span><span class="p">;</span> +</pre></div> + + +<h3 id="ubuntumysql">Ubuntu中配置Mysql编码<a class="headerlink" href="#ubuntumysql" title="Permanent link">&para;</a></h3> +<h5 id="_7">找到配置文件<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h5> +<p>我是通过<code>sudo apt-get install mysql</code>来安装的。mysql的配置文件在/etc/mysql/my.cnf +如果找不到这个文件,可以运行<code>sudo find / -iname ‘*.cnf’</code>查找所有的cnf文件</p> +<h5 id="_8">改配置文件<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h5> +<p>在[mysqld]下添加 +<code>default-character-set=utf8</code> +在[client]下添加 +<code>default-character-set=utf8</code></p> +<h5 id="mysql">重启mysql<a class="headerlink" href="#mysql" title="Permanent link">&para;</a></h5> +<p><code>sudo service mysql restart</code></p> +<h5 id="mysql_1">登录mysql查看是否成功<a class="headerlink" href="#mysql_1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">mysql</span> <span class="o">-</span><span class="n">u</span> <span class="n">root</span> + +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">SHOW</span> <span class="n">VARIABLES</span> <span class="n">LIKE</span> <span class="err">&#39;</span><span class="kt">char</span><span class="o">%</span><span class="err">&#39;</span><span class="p">;</span> +<span class="o">+--------------------------+----------------------------+</span> +<span class="o">|</span> <span class="n">Variable_name</span> <span class="o">|</span> <span class="n">VALUE</span> <span class="o">|</span> +<span class="o">+--------------------------+----------------------------+</span> +<span class="o">|</span> <span class="n">character_set_client</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_connection</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_database</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_filesystem</span> <span class="o">|</span> <span class="n">BINARY</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_results</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_server</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_set_system</span> <span class="o">|</span> <span class="n">utf8</span> <span class="o">|</span> +<span class="o">|</span> <span class="n">character_sets_dir</span> <span class="o">|</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">share</span><span class="o">/</span><span class="n">mysql</span><span class="o">/</span><span class="n">charsets</span><span class="o">/</span> <span class="o">|</span> +<span class="o">+--------------------------+----------------------------+</span> +<span class="mi">8</span> <span class="n">ROWS</span> <span class="n">IN</span> <span class="n">SET</span> <span class="p">(</span><span class="mf">0.00</span> <span class="n">sec</span><span class="p">)</span> +</pre></div> + + +<h5 id="_9">修改已经部署的数据库编码<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h5> +<p>感觉还是挺麻烦的,注意要修改数据库、表、字段的编码。</p>WonThu, 19 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-19:mysqlyu-ju-ru-men-1.htmlMysqlDjango 备份数据方法(1)http://wbowam.github.io/django-bei-fen-shu-ju-fang-fa-1.html<h3 id="_1">如下方法:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="nx">python</span> <span class="nx">manage.py</span> <span class="nx">dumpdata</span> <span class="o">&lt;</span><span class="nx">your_app</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="nx">temp_data.json</span> +<span class="err">##做一些毁数据的活儿</span> +<span class="nx">python</span> <span class="nx">manage.py</span> <span class="nx">loaddata</span> <span class="nx">temp_data.json</span> +</pre></div>WonWed, 18 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-18:django-bei-fen-shu-ju-fang-fa-1.htmlDjangoMysqlDjango中使用mysql数据库http://wbowam.github.io/djangozhong-shi-yong-mysqlshu-ju-ku.html<h3 id="mysql">安装Mysql<a class="headerlink" href="#mysql" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">mysql</span><span class="o">-</span><span class="n">server</span> +<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">python</span><span class="o">-</span><span class="n">mysqldb</span> +<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">libmysqlclient</span><span class="o">-</span><span class="n">dev</span> +</pre></div> + + +<h3 id="mysql-python">安装<code>mysql-python</code>模块<a class="headerlink" href="#mysql-python" title="Permanent link">&para;</a></h3> +<p><code>pip install mysql-python</code> </p> +<h3 id="database">创建并设置Database<a class="headerlink" href="#database" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">mysql</span> <span class="o">-</span><span class="n">u</span> <span class="n">root</span> <span class="o">-</span><span class="n">p</span> +<span class="n">Enter</span> <span class="n">password</span><span class="o">:</span> + +<span class="cp">###mysql&gt; CREATE DATABASE tulpar_db;(最好用下面的方法,创建数据库时指定编码,免得不识别汉字</span> +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">CREATE</span> <span class="n">DATABASE</span> <span class="n">tulpar_db</span> <span class="n">CHARACTER</span> <span class="n">SET</span> <span class="n">utf8</span> <span class="n">COLLATE</span> <span class="n">utf8_general_ci</span><span class="p">;</span> + +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">GRANT</span> <span class="n">ALL</span> <span class="n">ON</span> <span class="n">tulpar_db</span><span class="p">.</span><span class="o">*</span> <span class="n">TO</span> <span class="err">&#39;</span><span class="n">tulpar</span><span class="sc">&#39;@&#39;</span><span class="n">localhost</span><span class="err">&#39;</span> <span class="n">IDENTIFIED</span> <span class="n">BY</span> <span class="err">&#39;</span><span class="n">mypassword</span><span class="err">&#39;</span><span class="p">;</span> +<span class="n">Query</span> <span class="n">OK</span><span class="p">,</span> <span class="mi">0</span> <span class="n">rows</span> <span class="n">affected</span> <span class="p">(</span><span class="mf">0.03</span> <span class="n">sec</span><span class="p">)</span> + +<span class="n">mysql</span><span class="o">&gt;</span> <span class="n">quit</span> +<span class="n">Bye</span> +</pre></div> + + +<h3 id="django-settings">设置django settings<a class="headerlink" href="#django-settings" title="Permanent link">&para;</a></h3> +<p><code>settings.py</code> </p> +<div class="highlight"><pre><span class="n">DATABASES</span> <span class="o">=</span> <span class="p">{</span> + <span class="err">&#39;</span><span class="k">default</span><span class="err">&#39;</span><span class="o">:</span> <span class="p">{</span> + <span class="err">&#39;</span><span class="n">ENGINE</span><span class="err">&#39;</span><span class="o">:</span> <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">db</span><span class="p">.</span><span class="n">backends</span><span class="p">.</span><span class="n">mysql</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">NAME</span><span class="sc">&#39;:&#39;</span><span class="n">tulpar_db</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">USER</span><span class="err">&#39;</span> <span class="o">:</span><span class="err">&#39;</span><span class="n">tulpar</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="n">Not</span> <span class="n">used</span> <span class="n">with</span> <span class="n">sqlite3</span><span class="p">.,</span> + <span class="err">&#39;</span><span class="n">PASSWORD</span><span class="err">&#39;</span> <span class="o">:</span> <span class="err">&#39;</span><span class="n">mypassword</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="n">Not</span> <span class="n">used</span> <span class="n">with</span> <span class="n">sqlite3</span><span class="p">.</span> + <span class="err">&#39;</span><span class="n">HOST</span><span class="err">&#39;</span> <span class="o">:</span> <span class="err">&#39;&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="n">Set</span> <span class="n">to</span> <span class="n">empty</span> <span class="n">string</span> <span class="k">for</span> <span class="n">localhost</span><span class="p">.</span> <span class="n">Not</span> <span class="n">used</span> <span class="n">with</span> <span class="n">sqlite3</span><span class="p">.</span> + <span class="err">&#39;</span><span class="n">PORT</span><span class="err">&#39;</span> <span class="o">:</span> <span class="err">&#39;&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="n">Set</span> <span class="n">to</span> <span class="n">empty</span> <span class="n">string</span> <span class="k">for</span> <span class="k">default</span><span class="p">.</span> <span class="n">Not</span> <span class="n">used</span> <span class="n">with</span> <span class="n">sqlite3</span><span class="p">.</span> + <span class="p">}</span> +<span class="p">}</span> +</pre></div> + + +<h3 id="_1">生成数据<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p><code>python manage.py syncdb</code><br /> +<code>python manage.py runserver</code> </p>WonWed, 18 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-18:djangozhong-shi-yong-mysqlshu-ju-ku.htmlDjangoMysqlXadmin List_display中显示缩略图http://wbowam.github.io/xadmin-list_displayzhong-xian-shi-suo-lue-tu.html<h3 id="_1">需求如图:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p><img alt="Xadmin环境中" src="http://tulparblog.qiniudn.com/%E7%BC%A9%E7%95%A5%E5%9B%BE.png" /></p> +<h3 id="_2">方法:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p><code>models.py</code> </p> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">User</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">translation</span> <span class="n">import</span> <span class="n">ugettext</span> <span class="n">as</span> <span class="n">_</span> +<span class="n">from</span> <span class="n">userena</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">UserenaBaseProfile</span> + +<span class="n">class</span> <span class="n">MyProfile</span><span class="p">(</span><span class="n">UserenaBaseProfile</span><span class="p">)</span><span class="o">:</span> + <span class="n">user</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span><span class="n">unique</span><span class="o">=</span><span class="n">True</span><span class="p">,</span><span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">),</span><span class="n">related_name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">my_profile</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">one_card</span><span class="o">=</span><span class="n">models</span><span class="p">.</span><span class="n">FileField</span><span class="p">(</span><span class="n">u</span><span class="err">&#39;一卡通&#39;</span><span class="p">,</span><span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">,</span><span class="n">blank</span><span class="o">=</span><span class="n">True</span><span class="p">,</span><span class="n">upload_to</span><span class="o">=</span><span class="err">&#39;</span><span class="n">onecard</span><span class="err">&#39;</span><span class="p">)</span> + +<span class="cp">#########################关键是如下函数</span> + <span class="n">def</span> <span class="n">image_img</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">one_card</span><span class="o">:</span> + <span class="k">return</span> <span class="n">str</span><span class="p">(</span><span class="err">&#39;</span><span class="o">&lt;</span><span class="n">img</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;%s&quot;</span> <span class="o">/&gt;</span><span class="err">&#39;</span> <span class="o">%</span> <span class="n">self</span><span class="p">.</span><span class="n">one_card</span><span class="p">.</span><span class="n">url</span><span class="p">)</span> + <span class="nl">else:</span> + <span class="k">return</span> <span class="n">u</span><span class="err">&#39;上传头像&#39;</span> + <span class="n">image_img</span><span class="p">.</span><span class="n">short_description</span> <span class="o">=</span> <span class="err">&#39;头像&#39;</span> + <span class="n">image_img</span><span class="p">.</span><span class="n">allow_tags</span> <span class="o">=</span> <span class="n">True</span> +</pre></div> + + +<p><code>adminx.py</code> </p> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> + +<span class="cp"># Register your models here.</span> +<span class="n">import</span> <span class="n">xadmin</span> + +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">MyProfile</span> + +<span class="n">class</span> <span class="n">MyProfileAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="sc">&#39;,&#39;</span><span class="n">favourite_snack</span><span class="sc">&#39;,&#39;</span><span class="n">image_img</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">list_display_links</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="sc">&#39;,&#39;</span><span class="n">image_img</span><span class="err">&#39;</span><span class="p">)</span> + +<span class="n">xadmin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">MyProfile</span><span class="p">,</span><span class="n">MyProfileAdmin</span><span class="p">)</span> +</pre></div> + + +<h3 id="_3">效果图如下:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<p><img alt="太大了" src="http://tulparblog.qiniudn.com/%E6%95%88%E6%9E%9C%E5%9B%BE.png" /></p> +<hr /> +<h4 id="_4">很显然,该控制一下上传的图片了<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h4> +<p>使用<a href="https://github.com/tulpar008/django-stdimage">django-stdimage</a>解决此问题</p> +<h4 id="_5">安装<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4> +<h6 id="pil">得有PIL哦<a class="headerlink" href="#pil" title="Permanent link">&para;</a></h6> +<p><code>pip install django-stdimage</code> <br /> +添加‘stdimage’至‘INSTALLED_APPS’</p> +<h3 id="_6">使用<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3> +<h5 id="modelspy"><code>models.py</code><a class="headerlink" href="#modelspy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">User</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">translation</span> <span class="n">import</span> <span class="n">ugettext</span> <span class="n">as</span> <span class="n">_</span> +<span class="n">from</span> <span class="n">userena</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">UserenaBaseProfile</span> + +<span class="cp">#########################关键StdImageField()</span> +<span class="n">class</span> <span class="n">MyProfile</span><span class="p">(</span><span class="n">UserenaBaseProfile</span><span class="p">)</span><span class="o">:</span> + <span class="n">user</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span><span class="n">unique</span><span class="o">=</span><span class="n">True</span><span class="p">,</span><span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">),</span><span class="n">related_name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">my_profile</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">one_card</span><span class="o">=</span><span class="n">StdImageField</span><span class="p">(</span><span class="n">upload_to</span><span class="o">=</span><span class="err">&#39;</span><span class="n">onecard</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">variations</span><span class="o">=</span><span class="p">{</span><span class="err">&#39;</span><span class="n">thumbnail</span><span class="err">&#39;</span><span class="o">:</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">75</span><span class="p">)})</span> <span class="err">#</span> <span class="n">creates</span> <span class="n">a</span> <span class="n">thumbnail</span> <span class="n">resized</span> <span class="n">to</span> <span class="n">maximum</span> <span class="n">size</span> <span class="n">to</span> <span class="n">fit</span> <span class="n">a</span> <span class="mi">100</span><span class="n">x75</span> <span class="n">area</span> + +<span class="cp">#########################关键self.one_card.thumbnail.url</span> + <span class="n">def</span> <span class="n">image_img</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">one_card</span><span class="o">:</span> + <span class="k">return</span> <span class="n">str</span><span class="p">(</span><span class="err">&#39;</span><span class="o">&lt;</span><span class="n">img</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;%s&quot;</span> <span class="o">/&gt;</span><span class="err">&#39;</span> <span class="o">%</span> <span class="n">self</span><span class="p">.</span><span class="n">one_card</span><span class="p">.</span><span class="n">thumbnail</span><span class="p">.</span><span class="n">url</span><span class="p">)</span> + <span class="nl">else:</span> + <span class="k">return</span> <span class="n">u</span><span class="err">&#39;上传头像&#39;</span> + <span class="n">image_img</span><span class="p">.</span><span class="n">short_description</span> <span class="o">=</span> <span class="err">&#39;头像&#39;</span> + <span class="n">image_img</span><span class="p">.</span><span class="n">allow_tags</span> <span class="o">=</span> <span class="n">True</span> +</pre></div> + + +<h5 id="adminxpy"><code>adminx.py</code>不用做任何变化<a class="headerlink" href="#adminxpy" title="Permanent link">&para;</a></h5> +<h3 id="_7">效果图如下:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h3> +<p><img alt="最终完美效果" src="http://tulparblog.qiniudn.com/%E6%9C%80%E7%BB%88%E6%95%88%E6%9E%9C.png" /></p>WonWed, 18 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-18:xadmin-list_displayzhong-xian-shi-suo-lue-tu.htmlXadminDjangoXadmin中自动预填某个字段http://wbowam.github.io/xadminzhong-zi-dong-yu-tian-mou-ge-zi-duan.html<h3 id="_1">需求:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>今天写一个model时写了个字段<code>create_by=models.ForeignKey(User)</code>。 <br /> +想给它预填入当前的已登录用户。需求类似如下(当然不可能那样写): <br /> +<code>created_by = models.ForeignKey(User, default=request.user)</code><br /> +如果以上需求在<code>View</code>里,很好解决的。可现在在AdminModel里,而且在Xadmin环境下。<br /> +于是,Google,得<a href="http://stackoverflow.com/questions/937954/how-do-you-specify-a-default-for-a-django-foreignkey-model-or-adminmodel-field">StackOverFlow</a>,找到了<a href="http://www.b-list.org/weblog/2008/dec/24/admin/">参考资料1</a>。感谢Google,感谢StackOverFlowx,感谢<a href="http://www.b-list.org/weblog/2008/dec/24/admin/">参考资料1</a>。<a href="https://github.com/sshwsfc/django-xadmin/issues/96">参考资料2</a></p> +<h3 id="_2">解决方案<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<h4 id="django-admin">在默认的django admin环境下<a class="headerlink" href="#django-admin" title="Permanent link">&para;</a></h4> +<h5 id="modelspy"><code>models.py</code><a class="headerlink" href="#modelspy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">User</span> + +<span class="n">class</span> <span class="n">Kuaijian</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">created_by</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">User</span><span class="p">)</span> +</pre></div> + + +<h5 id="adminpy"><code>admin.py</code><a class="headerlink" href="#adminpy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span> <span class="n">import</span> <span class="n">admin</span> +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">Kuaijian</span> + +<span class="n">class</span> <span class="n">KuaijianAdmin</span><span class="p">(</span><span class="n">admin</span><span class="p">.</span><span class="n">ModelAdmin</span><span class="p">)</span><span class="o">:</span> + <span class="n">exclude</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">author</span><span class="err">&#39;</span><span class="p">,)</span><span class="err">##</span> +<span class="cp">###主要是如下函数的OverWrite</span> + <span class="n">def</span> <span class="n">save_model</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="n">change</span><span class="p">)</span><span class="o">:</span> + <span class="k">if</span> <span class="n">not</span> <span class="n">change</span><span class="o">:</span> + <span class="n">obj</span><span class="p">.</span><span class="n">created_by</span> <span class="o">=</span> <span class="n">request</span><span class="p">.</span><span class="n">user</span> + <span class="n">obj</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> + +<span class="n">admin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">Kuaijian</span><span class="p">,</span><span class="n">KuaijianAdmin</span><span class="p">)</span> +</pre></div> + + +<h4 id="xadmin">在Xadmin的环境下<a class="headerlink" href="#xadmin" title="Permanent link">&para;</a></h4> +<h5 id="modelspy_1"><code>models.py</code>跟上述的一样<a class="headerlink" href="#modelspy_1" title="Permanent link">&para;</a></h5> +<h5 id="adminxpy"><code>adminx.py</code><a class="headerlink" href="#adminxpy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">class</span> <span class="n">KuaijianAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">exclude</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">author</span><span class="err">&#39;</span><span class="p">,)</span><span class="err">##</span> +<span class="cp">###主要是如下函数的OverWrite</span> + <span class="n">def</span> <span class="n">save_models</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="n">self</span><span class="p">.</span><span class="n">new_obj</span><span class="p">.</span><span class="n">created_by</span><span class="o">=</span><span class="n">self</span><span class="p">.</span><span class="n">request</span><span class="p">.</span><span class="n">user</span> + <span class="n">self</span><span class="p">.</span><span class="n">new_obj</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +</pre></div>WonMon, 16 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-16:xadminzhong-zi-dong-yu-tian-mou-ge-zi-duan.htmlXadminDjangoUeditor在Django中的使用http://wbowam.github.io/ueditorzai-djangozhong-de-shi-yong.html<p>以前写过Ueditor在Django中的使用方法(虽然跟着上一个博客一起丢了),在此不赘述了。想学可以看看这位朋友的分享: +<a href="https://github.com/zhangfisher/DjangoUeditor">Django中使用Ueditor</a></p> +<p><a href="http://mushapi.sinaapp.com/using-ueditor-in-django-with-xadmin.html">http://mushapi.sinaapp.com/using-ueditor-in-django-with-xadmin.html</a></p> +<h3 id="1">1.安装<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<p><code>pip install DjangoUeditor</code></p> +<h3 id="2">2.启用<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<h5 id="install_appsdjangoueditor-app">在<code>INSTALL_APPS</code>里面增加DjangoUeditor app,如下:<a class="headerlink" href="#install_appsdjangoueditor-app" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">INSTALLED_APPS</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">#</span><span class="p">........</span> + <span class="err">&#39;</span><span class="n">DjangoUeditor</span><span class="err">&#39;</span><span class="p">,</span> + <span class="p">)</span> +</pre></div> + + +<h5 id="urlspy">在urls.py中增加:<a class="headerlink" href="#urlspy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre> <span class="n">url</span><span class="p">(</span><span class="n">r</span><span class="err">&#39;</span><span class="o">^</span><span class="n">ueditor</span><span class="o">/</span><span class="err">&#39;</span><span class="p">,</span><span class="n">include</span><span class="p">(</span><span class="err">&#39;</span><span class="n">DjangoUeditor</span><span class="p">.</span><span class="n">urls</span><span class="err">&#39;</span> <span class="p">)),</span> +</pre></div> + + +<h3 id="3">3.使用<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3> +<h5 id="models">在<code>models</code>中这样使用:<a class="headerlink" href="#models" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">DjangoUeditor</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">UEditorField</span> + <span class="n">class</span> <span class="n">Blog</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span> + <span class="n">Name</span><span class="o">=</span><span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(,</span><span class="n">max_length</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span><span class="n">blank</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + <span class="n">Content</span><span class="o">=</span><span class="n">UEditorField</span><span class="p">(</span><span class="n">u</span><span class="err">&#39;内容</span> <span class="err">&#39;</span><span class="p">,</span><span class="n">height</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span><span class="n">width</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span><span class="k">default</span><span class="o">=</span><span class="err">&#39;</span><span class="n">test</span><span class="err">&#39;</span><span class="p">,</span><span class="n">imagePath</span><span class="o">=</span><span class="s">&quot;uploadimg/&quot;</span><span class="p">,</span><span class="n">imageManagerPath</span><span class="o">=</span><span class="s">&quot;imglib&quot;</span><span class="p">,</span><span class="n">toolbars</span><span class="o">=</span><span class="err">&#39;</span><span class="n">mini</span><span class="err">&#39;</span><span class="p">,</span><span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;elementPathEnabled&quot;</span><span class="o">:</span><span class="n">True</span><span class="p">},</span><span class="n">filePath</span><span class="o">=</span><span class="err">&#39;</span><span class="n">upload</span><span class="err">&#39;</span><span class="p">,</span><span class="n">blank</span><span class="o">=</span><span class="n">True</span><span class="p">)</span> + +<span class="err">&#39;&#39;&#39;</span> +<span class="err">说明:</span> + <span class="n">UEditorField</span><span class="err">继承自</span><span class="n">models</span><span class="p">.</span><span class="n">TextField</span><span class="p">,</span><span class="err">因此你可以直接将</span><span class="n">model</span><span class="err">里面定义的</span><span class="n">models</span><span class="p">.</span><span class="n">TextField</span><span class="err">直接改成</span><span class="n">UEditorField</span><span class="err">即可。</span> + <span class="n">UEditorField</span><span class="err">提供了额外的参数:</span> + <span class="nl">toolbars:</span><span class="err">配置你想显示的工具栏,取值为</span><span class="n">mini</span><span class="p">,</span><span class="n">normal</span><span class="p">,</span><span class="n">full</span><span class="err">,代表小,一般,全部。如果默认的工具栏不符合您的要求,您可以在</span><span class="n">settings</span><span class="err">里面配置自己的显示按钮。参见后面介绍。</span> + <span class="nl">imagePath:</span><span class="err">图片上传的路径</span><span class="p">,</span><span class="err">如</span><span class="s">&quot;images/&quot;</span><span class="p">,</span><span class="err">实现上传到</span><span class="s">&quot;{{MEDIA_ROOT}}/images&quot;</span><span class="err">文件夹</span> + <span class="nl">filePath:</span><span class="err">附件上传的路径</span><span class="p">,</span><span class="err">如</span><span class="s">&quot;files/&quot;</span><span class="p">,</span><span class="err">实现上传到</span><span class="s">&quot;{{MEDIA_ROOT}}/files&quot;</span><span class="err">文件夹</span> + <span class="nl">scrawlPath:</span><span class="err">涂鸦文件上传的路径</span><span class="p">,</span><span class="err">如</span><span class="s">&quot;scrawls/&quot;</span><span class="p">,</span><span class="err">实现上传到</span><span class="s">&quot;{{MEDIA_ROOT}}/scrawls&quot;</span><span class="err">文件夹</span><span class="p">,</span><span class="err">如果不指定则默认</span><span class="o">=</span><span class="n">imagepath</span> + <span class="nl">imageManagerPath:</span><span class="err">图片管理器显示的路径,如</span><span class="s">&quot;imglib/&quot;</span><span class="p">,</span><span class="err">实现上传到</span><span class="s">&quot;{{MEDIA_ROOT}}/imglib&quot;</span><span class="p">,</span><span class="err">如果不指定则默认</span><span class="o">=</span><span class="n">imagepath</span><span class="err">。</span> + <span class="n">options</span><span class="err">:其他</span><span class="n">UEditor</span><span class="err">参数,字典类型。参见</span><span class="n">Ueditor</span><span class="err">的文档`</span><span class="n">ueditor_config</span><span class="p">.</span><span class="n">js</span><span class="err">`里面的说明。</span> + <span class="nl">css:</span><span class="err">编辑器</span><span class="n">textarea</span><span class="err">的</span><span class="n">CSS</span><span class="err">样式</span> + <span class="n">width</span><span class="err">,</span><span class="n">height</span><span class="o">:</span><span class="err">编辑器的宽度和高度,以像素为单位。</span> +<span class="err">&#39;&#39;&#39;</span> +</pre></div> + + +<h5 id="csrf_token">在表单中使用,如下:(使用表单时注意{% csrf_token %})<a class="headerlink" href="#csrf_token" title="Permanent link">&para;</a></h5> +<p>在ModelForm中:(Ueditor的配置来自Model,所以在此不需import)</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">TestUeditorModelForm</span><span class="p">(</span><span class="n">forms</span><span class="p">.</span><span class="n">ModelForm</span><span class="p">)</span><span class="o">:</span> + <span class="n">class</span> <span class="n">Meta</span><span class="o">:</span> + <span class="n">model</span><span class="o">=</span><span class="n">Blog</span> +</pre></div> + + +<p>在普通Form中:</p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">DjangoUeditor</span><span class="p">.</span><span class="n">forms</span> <span class="n">import</span> <span class="n">UEditorField</span> + <span class="n">class</span> <span class="n">TestUEditorForm</span><span class="p">(</span><span class="n">forms</span><span class="p">.</span><span class="n">Form</span><span class="p">)</span><span class="o">:</span> + <span class="n">Description</span><span class="o">=</span><span class="n">UEditorField</span><span class="p">(</span><span class="s">&quot;描述&quot;</span><span class="p">,</span><span class="n">initial</span><span class="o">=</span><span class="s">&quot;abc&quot;</span><span class="p">,</span><span class="n">width</span><span class="o">=</span><span class="mi">600</span><span class="p">,</span><span class="n">height</span><span class="o">=</span><span class="mi">800</span><span class="p">)</span> +</pre></div> + + +<h5 id="_1">在模板里面使用:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="nt">&lt;head&gt;</span> + ...... + {{ form.media }} #这一句会将所需要的CSS和JS加进来。 + ...... + <span class="nt">&lt;/head&gt;</span> +</pre></div> + + +<div class="highlight"><pre><span class="o">**</span><span class="err">注:运行</span><span class="n">collectstatic</span><span class="err">命令,将所依赖的</span><span class="n">css</span><span class="p">,</span><span class="n">js</span><span class="err">之类的文件复制到</span><span class="p">{{</span><span class="n">STATIC_ROOT</span><span class="p">}}</span><span class="err">文件夹里面。</span><span class="o">**</span> +</pre></div> + + +<h3 id="4">4.定制<a class="headerlink" href="#4" title="Permanent link">&para;</a></h3> +<h5 id="settingpy">在<code>setting.py</code>中配置:<a class="headerlink" href="#settingpy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">UEDITOR_SETTINGS</span><span class="o">=</span><span class="p">{</span> + <span class="s">&quot;toolbars&quot;</span><span class="o">:</span><span class="p">{</span> <span class="err">#定义多个工具栏显示的按钮,允行定义多个</span> + <span class="s">&quot;name1&quot;</span><span class="o">:</span><span class="p">[[</span> <span class="err">&#39;</span><span class="n">source</span><span class="err">&#39;</span><span class="p">,</span> <span class="sc">&#39;|&#39;</span><span class="p">,</span><span class="err">&#39;</span><span class="n">bold</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">italic</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">underline</span><span class="err">&#39;</span><span class="p">]],</span> + <span class="s">&quot;name2&quot;</span><span class="p">,[]</span> + <span class="p">},</span> + <span class="s">&quot;images_upload&quot;</span><span class="o">:</span><span class="p">{</span> + <span class="s">&quot;allow_type&quot;</span><span class="o">:</span><span class="s">&quot;jpg,png&quot;</span><span class="p">,</span> <span class="err">#定义允许的上传的图片类型</span> + <span class="s">&quot;path&quot;</span><span class="o">:</span><span class="s">&quot;&quot;</span><span class="p">,</span> <span class="err">#定义默认的上传路径</span> + <span class="s">&quot;max_size&quot;</span><span class="o">:</span><span class="s">&quot;2222kb&quot;</span> <span class="err">#定义允许上传的图片大小,</span><span class="mi">0</span><span class="err">代表不限制</span> + <span class="p">},</span> + <span class="s">&quot;files_upload&quot;</span><span class="o">:</span><span class="p">{</span> + <span class="s">&quot;allow_type&quot;</span><span class="o">:</span><span class="s">&quot;zip,rar&quot;</span><span class="p">,</span> <span class="err">#定义允许的上传的文件类型</span> + <span class="s">&quot;path&quot;</span><span class="o">:</span><span class="s">&quot;&quot;</span> <span class="err">#定义默认的上传路径</span> + <span class="s">&quot;max_size&quot;</span><span class="o">:</span><span class="s">&quot;2222kb&quot;</span> <span class="err">#定义允许上传的文件大小,</span><span class="mi">0</span><span class="err">代表不限制</span> + <span class="p">},,</span> + <span class="s">&quot;image_manager&quot;</span><span class="o">:</span><span class="p">{</span> + <span class="s">&quot;path&quot;</span><span class="o">:</span><span class="s">&quot;&quot;</span> <span class="err">#图片管理器的位置</span><span class="p">,</span><span class="err">如果没有指定,默认跟图片路径上传一样</span> + <span class="p">},</span> + <span class="s">&quot;scrawl_upload&quot;</span><span class="o">:</span><span class="p">{</span> + <span class="s">&quot;path&quot;</span><span class="o">:</span><span class="s">&quot;&quot;</span> <span class="err">#涂鸦图片默认的上传路径</span> + <span class="p">}</span> + <span class="p">}</span> +</pre></div>WonSat, 14 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-14:ueditorzai-djangozhong-de-shi-yong.htmlUeditorDjangoXadmin入门(2)http://wbowam.github.io/xadminru-men-2.html<h2 id="xadmin">Xadmin 的插件介绍<a class="headerlink" href="#xadmin" title="Permanent link">&para;</a></h2> +<p>(本来想自己总结一遍的,可太喜欢Xadmin的文档了,言简意赅,排版精美,就直接搬了,望大侠们勿喷)</p> +<h3 id="1-action">1. Action<a class="headerlink" href="#1-action" title="Permanent link">&para;</a></h3> +<h4 id="_1">功能<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<p>Action 插件在数据列表页面提供了数据选择功能, 选择后的数据可以经过 Action 做特殊的处理. 默认提供的 Action 为批量删除功能.</p> +<h4 id="_2">截图<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p><img alt="Action" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/action.png" /></p> +<h4 id="_3">使用<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4> +<p>开发者可以设置 Model OptionClass 的 actions 属性, 该属性是一个列表, 包含您想启用的 Action 的类. 系统已经默认内置了删除数据的 Action, 当然您可以自己制作 Action 来实现特定的功能, 制作 Action 的实例如下.</p> +<p>首先要创建一个 Action 类, 该类需要继承 BaseActionView. BaseActionView 是 ModelAdminView 的子类:</p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">xadmin</span><span class="p">.</span><span class="n">plugins</span><span class="p">.</span><span class="n">actions</span> <span class="n">import</span> <span class="n">BaseActionView</span> + +<span class="n">class</span> <span class="n">MyAction</span><span class="p">(</span><span class="n">BaseActionView</span><span class="p">)</span><span class="o">:</span> + + <span class="err">#</span> <span class="err">这里需要填写三个属性</span> + <span class="n">action_name</span> <span class="o">=</span> <span class="s">&quot;my_action&quot;</span> <span class="err">#</span><span class="o">:</span> <span class="err">相当于这个</span> <span class="n">Action</span> <span class="err">的唯一标示</span><span class="p">,</span> <span class="err">尽量用比较针对性的名字</span> + <span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="n">u</span><span class="err">&#39;</span><span class="n">Test</span> <span class="n">selected</span> <span class="o">%</span><span class="p">(</span><span class="n">verbose_name_plural</span><span class="p">)</span><span class="n">s</span><span class="err">&#39;</span><span class="p">)</span> <span class="err">#</span><span class="o">:</span> <span class="err">描述</span><span class="p">,</span> <span class="err">出现在</span> <span class="n">Action</span> <span class="err">菜单中</span><span class="p">,</span> <span class="err">可以使用</span> <span class="err">``</span><span class="o">%</span><span class="p">(</span><span class="n">verbose_name_plural</span><span class="p">)</span><span class="n">s</span><span class="err">``</span> <span class="err">代替</span> <span class="n">Model</span> <span class="err">的名字</span><span class="p">.</span> + + <span class="n">model_perm</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">change</span><span class="err">&#39;</span> <span class="err">#</span><span class="o">:</span> <span class="err">该</span> <span class="n">Action</span> <span class="err">所需权限</span> + + <span class="err">#</span> <span class="err">而后实现</span> <span class="n">do_action</span> <span class="err">方法</span> + <span class="n">def</span> <span class="n">do_action</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">queryset</span><span class="p">)</span><span class="o">:</span> + <span class="err">#</span> <span class="n">queryset</span> <span class="err">是包含了已经选择的数据的</span> <span class="n">queryset</span> + <span class="k">for</span> <span class="n">obj</span> <span class="n">in</span> <span class="n">queryset</span><span class="o">:</span> + <span class="err">#</span> <span class="n">obj</span> <span class="err">的操作</span> + <span class="p">...</span> + <span class="err">#</span> <span class="err">返回</span> <span class="n">HttpResponse</span> + <span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(...)</span> +</pre></div> + + +<p>然后在 Model 的 OptionClass 中使用这个 Action:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">MyModelAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + + <span class="n">actions</span> <span class="o">=</span> <span class="p">[</span><span class="n">MyAction</span><span class="p">,</span> <span class="p">]</span> +</pre></div> + + +<p>这样就完成了自己的 Action</p> +<h4 id="api">API<a class="headerlink" href="#api" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">class</span> <span class="n">xadmin</span><span class="p">.</span><span class="n">plugins</span><span class="p">.</span><span class="n">actions</span><span class="p">.</span><span class="n">ActionPlugin</span><span class="p">(</span><span class="n">admin_view</span><span class="p">)</span> +</pre></div> + + +<h4 id="_4">我的效果如下: <a href="https://github.com/tulpar008/testing_Xadmin">我的源码在此</a><a class="headerlink" href="#_4" title="Permanent link">&para;</a></h4> +<p><img alt="Action" src="http://tulparblog.qiniudn.com/xadmin2action.png" /></p> +<h3 id="2">2. 数据过滤器<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<h4 id="_5">功能<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4> +<p>在数据列表页面提供数据过滤功能, 包括: 模糊搜索, 数字范围搜索, 日期搜索等等</p> +<h4 id="_6">截图<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h4> +<p><img alt="数据过滤器" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/filter.png" /></p> +<h4 id="_7">使用<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h4> +<p>在 Model OptionClass 中设置以下属性: </p> +<p><code>list_filter</code> 属性: </p> +<p>该属性指定可以过滤的列的名字, 系统会自动生成搜索器 </p> +<p><code>search_fields</code> 属性: </p> +<p>属性指定可以通过搜索框搜索的数据列的名字, 搜索框搜索使用的是模糊查找的方式, 一般用来搜素名字等字符串字段 </p> +<p><code>free_query_filter</code> 属性: </p> +<p>默认为 True , 指定是否可以自由搜索. 如果开启自有搜索, 用户可以通过 url 参数来进行特定的搜索, 例如: </p> +<p><code>http://xxx.com/xadmin/auth/user/?name__contains=tony</code> +使用过滤器的例子: </p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">UserAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">list_filter</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">is_staff</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">is_superuser</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">is_active</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">search_fields</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">username</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">first_name</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">last_name</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">email</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h4 id="_8">制作过滤器<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h4> +<p>您也可以制作自己的过滤器, 用来进行一些特定的过滤. 过滤器需要继承 <code>xadmin.filters.BaseFilter</code> 类, 并使用 <code>xadmin.filters.manager</code> 注册过滤器.</p> +<h4 id="_9"><a href="https://github.com/tulpar008/testing_Xadmin/tree/master">我的源码在此</a> 我的效果如下<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h4> +<p><img alt="数据过滤" src="http://tulparblog.qiniudn.com/xadmin2%E6%95%B0%E6%8D%AE%E8%BF%87%E6%BB%A4%E5%99%A8.png" /></p> +<h3 id="3">3. 图表插件<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3> +<h4 id="_10">功能<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h4> +<p>在数据列表页面, 跟列表数据生成图表. 可以指定多个数据列, 生成多个图表.</p> +<h4 id="_11">截图<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h4> +<p><img alt="图表" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/chart.png" /></p> +<h4 id="_12">使用<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h4> +<p>在 Model OptionClass 中设定 data_charts 属性, 该属性为 dict 类型, key 是图表的标示名称, value 是图表的具体设置属性. 使用示例: </p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">RecordAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">data_charts</span> <span class="o">=</span> <span class="p">{</span> + <span class="s">&quot;user_count&quot;</span><span class="o">:</span> <span class="p">{</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">u</span><span class="s">&quot;User Report&quot;</span><span class="p">,</span> <span class="s">&quot;x-field&quot;</span><span class="o">:</span> <span class="s">&quot;date&quot;</span><span class="p">,</span> <span class="s">&quot;y-field&quot;</span><span class="o">:</span> <span class="p">(</span><span class="s">&quot;user_count&quot;</span><span class="p">,</span> <span class="s">&quot;view_count&quot;</span><span class="p">),</span> <span class="s">&quot;order&quot;</span><span class="o">:</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">date</span><span class="err">&#39;</span><span class="p">,)},</span> + <span class="s">&quot;avg_count&quot;</span><span class="o">:</span> <span class="p">{</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">u</span><span class="s">&quot;Avg Report&quot;</span><span class="p">,</span> <span class="s">&quot;x-field&quot;</span><span class="o">:</span> <span class="s">&quot;date&quot;</span><span class="p">,</span> <span class="s">&quot;y-field&quot;</span><span class="o">:</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">avg_count</span><span class="err">&#39;</span><span class="p">,),</span> <span class="s">&quot;order&quot;</span><span class="o">:</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">date</span><span class="err">&#39;</span><span class="p">,)}</span> + <span class="p">}</span> +</pre></div> + + +<p>图表的主要属性为: </p> +<p><code>title</code> : 图表的显示名称 </p> +<p><code>x-field</code> : 图表的 X 轴数据列, 一般是日期, 时间等 </p> +<p><code>y-field</code> : 图表的 Y 轴数据列, 该项是一个 list, 可以同时设定多个列, 这样多个列的数据会在同一个图表中显示 </p> +<p><code>order</code> : 排序信息, 如果不写则使用数据列表的排序 </p> +<h4 id="api_1">API<a class="headerlink" href="#api_1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">class</span> <span class="n">xadmin</span><span class="p">.</span><span class="n">plugins</span><span class="p">.</span><span class="n">chart</span><span class="p">.</span><span class="n">ChartsPlugin</span><span class="p">(</span><span class="n">admin_view</span><span class="p">)[</span><span class="n">source</span><span class="p">]</span> +<span class="n">class</span> <span class="n">xadmin</span><span class="p">.</span><span class="n">plugins</span><span class="p">.</span><span class="n">chart</span><span class="p">.</span><span class="n">ChartsView</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)[</span><span class="n">source</span><span class="p">]</span><span class="err">¶</span> +</pre></div> + + +<h4 id="_13">我的效果图:不知怎么也没弄出图表。。。。。<a href="https://github.com/tulpar008/testing_Xadmin/tree/master">我的代码在此</a><a class="headerlink" href="#_13" title="Permanent link">&para;</a></h4> +<p><img alt="图表" src="http://tulparblog.qiniudn.com/xadmin2%E5%9B%BE%E8%A1%A8%E6%8F%92%E4%BB%B6.png" /></p> +<h3 id="4">4.数据导出<a class="headerlink" href="#4" title="Permanent link">&para;</a></h3> +<h4 id="_14">功能<a class="headerlink" href="#_14" title="Permanent link">&para;</a></h4> +<p>该插件在数据列表页面提供了数据导出功能, 可以导出 <code>Excel</code>, <code>CSV</code>, <code>XML</code>, <code>json</code> 格式. </p> +<h4 id="_15">截图<a class="headerlink" href="#_15" title="Permanent link">&para;</a></h4> +<p><img alt="数据导出" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/export.png" /></p> +<h4 id="_16">使用<a class="headerlink" href="#_16" title="Permanent link">&para;</a></h4> +<h6 id="note-excel-xlwt">Note:如果想要导出 Excel 数据, 需要安装 xlwt.<a class="headerlink" href="#note-excel-xlwt" title="Permanent link">&para;</a></h6> +<p>默认情况下, xadmin 会提供 Excel, CSV, XML, json 四种格式的数据导出. 您可以通过设置 OptionClass 的 list_export 属性来指定使用 哪些导出格式 (四种各使用分别用 xls, csv, xml, json 表示), 或是将 list_export 设置为 None 来禁用数据导出功能. 示例如下:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">MyModelAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + + <span class="n">list_export</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">xls</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">xml</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">json</span><span class="err">&#39;</span><span class="p">)</span> +</pre></div> + + +<h4 id="_17">我的效果图:不知怎么也没弄出图表。。。。。<a href="https://github.com/tulpar008/testing_Xadmin/tree/master">我的代码在此</a><a class="headerlink" href="#_17" title="Permanent link">&para;</a></h4> +<p><img alt="数据导出" src="http://tulparblog.qiniudn.com/xadmin2%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%87%BA.png" /></p> +<h3 id="5">5. 列表定时刷新<a class="headerlink" href="#5" title="Permanent link">&para;</a></h3> +<h4 id="_18">功能<a class="headerlink" href="#_18" title="Permanent link">&para;</a></h4> +<p>该插件在数据列表页面提供了定时刷新功能, 对于需要实时刷新列表页面查看即时数据的情况非常有用.</p> +<h4 id="_19">截图<a class="headerlink" href="#_19" title="Permanent link">&para;</a></h4> +<p><img alt="列表刷新" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/refresh.png" /></p> +<h4 id="_20">使用<a class="headerlink" href="#_20" title="Permanent link">&para;</a></h4> +<p>使用数据刷新插件非常简单, 设置 OptionClass 的 refresh_times 属性即可. refresh_times 属性是存有刷新时间的数组. xadmin 默认不开启该插件. 示例如下:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">MyModelAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + + <span class="err">#</span> <span class="err">这会显示一个下拉列表</span><span class="p">,</span> <span class="err">用户可以选择</span><span class="mi">3</span><span class="err">秒或</span><span class="mi">5</span><span class="err">秒刷新一次页面</span><span class="p">.</span> + <span class="n">refresh_times</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> +</pre></div> + + +<h4 id="_21">我的效果图:<a href="https://github.com/tulpar008/testing_Xadmin/tree/master">我的代码在此</a><a class="headerlink" href="#_21" title="Permanent link">&para;</a></h4> +<p><img alt="刷新" src="http://tulparblog.qiniudn.com/xadmin2%E5%88%B7%E6%96%B0.png" /></p> +<h3 id="6">6. 显示数据详情<a class="headerlink" href="#6" title="Permanent link">&para;</a></h3> +<h4 id="_22">功能<a class="headerlink" href="#_22" title="Permanent link">&para;</a></h4> +<p>该插件可以在列表页中显示相关字段的详细信息, 使用 Ajax 在列表页中显示.</p> +<h4 id="_23">截图<a class="headerlink" href="#_23" title="Permanent link">&para;</a></h4> +<p><img alt="数据详情" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/details.png" /></p> +<h4 id="_24">使用<a class="headerlink" href="#_24" title="Permanent link">&para;</a></h4> +<p>使用该插件主要设置 <code>OptionClass</code> 的 <code>show_detail_fields</code>, <code>show_all_rel_details</code> 两个属性. <code>show_detail_fields</code> 属性设置哪些字段要显示详细信息, <code>show_all_rel_details</code> 属性设置时候自动显示所有关联字段的详细信息, 该属性默认为 <code>True</code>. 示例如下:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">MyModelAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + + <span class="n">show_detail_fields</span> <span class="o">=</span> <span class="p">[</span><span class="err">&#39;</span><span class="n">group</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">father</span><span class="err">&#39;</span><span class="p">,</span> <span class="p">...]</span> +</pre></div> + + +<h4 id="_25">每弄出来啊<a class="headerlink" href="#_25" title="Permanent link">&para;</a></h4> +<h3 id="7">7. 数据即时编辑<a class="headerlink" href="#7" title="Permanent link">&para;</a></h3> +<h4 id="_26">功能<a class="headerlink" href="#_26" title="Permanent link">&para;</a></h4> +<p>该插件可以在列表页中即时编辑某字段的值, 使用 Ajax 技术, 无需提交或刷新页面即可完成数据的修改, 对于需要频繁修改的字段(如: 状态)相当有用.</p> +<h4 id="_27">截图<a class="headerlink" href="#_27" title="Permanent link">&para;</a></h4> +<p><img alt="即时编辑" src="http://xadmin.readthedocs.org/en/docs-chinese/_images/editable.png" /></p> +<h4 id="_28">使用<a class="headerlink" href="#_28" title="Permanent link">&para;</a></h4> +<p>使用该插件主要设置 OptionClass 的 list_editable 属性. list_editable 属性设置哪些字段需要即时修改功能. 示例如下:</p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">MyModelAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + + <span class="n">list_editable</span> <span class="o">=</span> <span class="p">[</span><span class="err">&#39;</span><span class="n">price</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">status</span><span class="err">&#39;</span><span class="p">,</span> <span class="p">...]</span> +</pre></div> + + +<h4 id="_29">我的效果图<a class="headerlink" href="#_29" title="Permanent link">&para;</a></h4> +<p><img alt="即时编辑" src="http://tulparblog.qiniudn.com/xadmin2%E5%8D%B3%E6%97%B6%E7%BC%96%E8%BE%91.png" /></p> +<h3 id="8">8.改主题的插件<a class="headerlink" href="#8" title="Permanent link">&para;</a></h3> +<p>在<code>adminx.py</code>中加入下面代码: </p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">xadmin</span> <span class="n">import</span> <span class="n">views</span> +<span class="n">class</span> <span class="n">BaseSetting</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="n">enable_themes</span> <span class="o">=</span> <span class="n">True</span> + <span class="n">use_bootswatch</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">xadmin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">views</span><span class="p">.</span><span class="n">BaseAdminView</span><span class="p">,</span><span class="n">BaseSetting</span><span class="p">)</span> +</pre></div>WonFri, 13 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-13:xadminru-men-2.htmlXadmin郁闷的发现一个双胞胎师兄http://wbowam.github.io/yu-men-de-fa-xian-yi-ge-shuang-bao-tai-shi-xiong.html<p>今天google markdown,进了一个博客。<br /> +奇迹出现了。 +<a href="http://sargeraswang.github.io/">程序员小刚</a> +小刚前辈用的博客主题跟我的一模一样,也是用多说评论系统,出奇的相似。<br /> +可见这个主题的确很好看,(<em>^__^</em>) 嘻嘻…… <br /> +大概逛了一下,小刚前辈也是做IT的,(<em>^__^</em>) 嘻嘻…… </p>WonFri, 13 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-13:yu-men-de-fa-xian-yi-ge-shuang-bao-tai-shi-xiong.html博客把时间当作朋友读后感(1)http://wbowam.github.io/ba-shi-jian-dang-zuo-peng-you-du-hou-gan-1.html<p>读书最大的快乐莫过于共鸣。</p> +<hr /> +<h3 id="_1">我们都生活在同一个世界里,可都在自己的版本里。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>改变自己意味着,属于自己的版本的世界随着改变。当你的能力够大,你也能改变他人的版本,或多或少取决于你的影响力。——带来了以下问题</p> +<hr /> +<p>以上的版本这个概念来自李笑来的《把时间当作朋友》,<strong>感觉措辞不够合理</strong>。我们作为程序员,用过版本号,深有体会。就像那句名言(不记得原话怎么说的):如果你觉得写的软件不够好,那就称它为1.0版本吧。每一个版本号互相之间是独立的,没有交集的。如果1.0版本出了问题,2.0版本可以是照样跑;如果3.0版本崩了,10.0版本可以是好好的</p> +<h5 id="60102030405060702014612it10iphone">世界:假设世界上有60亿人,每个人的世界都有一个版本号,我的是1.0,牛顿的是2.0,你的是3.0,罗斯福的是4.0,爱因斯坦的是5.0,乔布斯的是6.0,他的是7.0.............版本号意味着我们的世界都是独立的。很显然,我活着(2014年6月12号),但我不应该在这里看着《把时间当作朋友》,上着网,而应该坐在椅子上想着:这个苹果为什么会掉在我的头上呢?很显然牛顿影响了我的世界,他的版本影响到我的版本了,在IT世界里,我会说:凭什么?我是1.0啊!...........而你不应该对着Iphone咪咪笑,罗斯福不应该对日本人这么残忍。。。。。。。。。。。<a class="headerlink" href="#60102030405060702014612it10iphone" title="Permanent link">&para;</a></h5> +<p>@李笑来 </p> +<h4 id="_2">很显然,假设不成立,措辞不够合理。<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4>WonThu, 12 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-12:ba-shi-jian-dang-zuo-peng-you-du-hou-gan-1.html读书把时间当作朋友读后感(2)http://wbowam.github.io/ba-shi-jian-dang-zuo-peng-you-du-hou-gan-2.html<h3 id="_1">用正确方式做正确的事情,时间无需管理。<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<h3 id="_2">管理焦点不应该是时间,而是自己。<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<h4 id="_3">时间只是个工具,它用于把我们的生命划分成无数个块。<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4> +<p>生命就像一条高速公路,我们就像一辆不到终点不会停车的长途汽车,有时候看着路边的风景,有时候闭着眼睛养神,但无论何时我们一直在走。路标会告诉我们自己走在哪一路段,会走向哪里。而这路标就是时间</p>WonThu, 12 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-12:ba-shi-jian-dang-zuo-peng-you-du-hou-gan-2.html读书部署Socket.io 的demohttp://wbowam.github.io/bu-shu-socketio-de-demo.html<h1 id="1nvm">1.安装nvm<a class="headerlink" href="#1nvm" title="Permanent link">&para;</a></h1> +<div class="highlight"><pre><span class="err">$</span> <span class="n">wget</span> <span class="o">-</span><span class="n">qO</span><span class="o">-</span> <span class="n">https</span><span class="o">:</span><span class="c1">//raw.github.com/creationix/nvm/v0.4.0/install.sh | sh</span> +</pre></div> + + +<h1 id="2node">2.安装node<a class="headerlink" href="#2node" title="Permanent link">&para;</a></h1> +<div class="highlight"><pre><span class="n">nvm</span> <span class="n">install</span> <span class="mf">0.1</span> +</pre></div> + + +<h6 id="usrsbinsrc">若过程中如果报错,说:创建目录/usr/sbin/src 权限不够<a class="headerlink" href="#usrsbinsrc" title="Permanent link">&para;</a></h6> +<p>我用了个极端的方法来解决此问题,不推荐</p> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">chmod</span> <span class="mi">777</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span> +</pre></div> + + +<h1 id="3">3. 跑起<a class="headerlink" href="#3" title="Permanent link">&para;</a></h1> +<div class="highlight"><pre><span class="n">cd</span> <span class="n">socket</span><span class="p">.</span><span class="n">io</span><span class="o">/</span><span class="n">example</span><span class="o">/</span><span class="n">chat</span><span class="o">/</span> +<span class="n">node</span> <span class="n">index</span><span class="p">.</span><span class="n">js</span> +</pre></div> + + +<h6 id="moudle">日如果报错误说,缺某某moudle,就一个个安装那些插件即可,如:<a class="headerlink" href="#moudle" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="n">npm</span> <span class="n">install</span> <span class="o">-</span><span class="n">g</span> <span class="n">express</span> +</pre></div>WonWed, 11 Jun 2014 00:00:00 +0800tag:wbowam.github.io,2014-06-11:bu-shu-socketio-de-demo.htmlSocket.ioDjango Dir 配置(方法一)http://wbowam.github.io/django-dir-pei-zhi-fang-fa-yi.html<h5 id="env">Env:<a class="headerlink" href="#env" title="Permanent link">&para;</a></h5> +<ul> +<li>django==1.4.5</li> +<li>python==2.7</li> +<li>ubuntu==13.04</li> +</ul> +<hr /> +<h3 id="_1">公用部分<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>settings.py</p> +<div class="highlight"><pre><span class="cp">##added by Tulpar,20140514</span> +<span class="n">import</span> <span class="n">os</span> +<span class="n">settings_dir</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">)</span> +<span class="n">PROJECT_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">settings_dir</span><span class="p">))</span> +</pre></div> + + +<h3 id="media">MEDIA<a class="headerlink" href="#media" title="Permanent link">&para;</a></h3> +<p>settings.py</p> +<div class="highlight"><pre><span class="n">MEDIA_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">MEDIA_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span> +</pre></div> + + +<p>urls.py</p> +<div class="highlight"><pre><span class="err">#</span><span class="vi">#added</span> <span class="k">by</span> <span class="nx">Tulpar</span><span class="p">,</span><span class="mi">20140514</span> +<span class="nb">from</span> <span class="nx">django.conf</span> <span class="k">import</span> <span class="nx">settings</span> + +<span class="nx">urlpatterns</span> <span class="o">+=</span> <span class="nx">patterns</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> + <span class="nb">url</span><span class="p">(</span><span class="nb">r</span><span class="s2">&quot;^media/(?P&lt;path&gt;.*)$&quot;</span><span class="p">,</span><span class="s2">&quot;django.views.static.serve&quot;</span><span class="p">,{</span><span class="s2">&quot;document_root&quot;</span><span class="p">:</span> <span class="nx">settings.MEDIA_ROOT</span><span class="p">,}),</span> +<span class="p">)</span> +</pre></div> + + +<h3 id="static">STATIC<a class="headerlink" href="#static" title="Permanent link">&para;</a></h3> +<p>Settings.py</p> +<div class="highlight"><pre><span class="n">STATIC_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="k">static</span><span class="o">/</span><span class="err">&#39;</span><span class="p">)</span> + +<span class="n">STATIC_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="k">static</span><span class="o">/</span><span class="err">&#39;</span> + +<span class="n">STATICFILES_DIRS</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">#</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="k">static</span><span class="o">/</span><span class="err">&#39;</span><span class="p">),</span> + <span class="p">)</span> +</pre></div> + + +<p>url.py</p> +<div class="highlight"><pre><span class="nb">from</span> <span class="nx">django.conf</span> <span class="k">import</span> <span class="nx">settings</span> +<span class="nx">urlpatterns</span> <span class="o">+=</span> <span class="nx">patterns</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> + <span class="nb">url</span><span class="p">(</span><span class="nb">r</span><span class="s2">&quot;^static/(?P&lt;path&gt;.*)$&quot;</span><span class="p">,</span><span class="s2">&quot;django.views.static.serve&quot;</span><span class="p">,{</span><span class="s2">&quot;document_root&quot;</span><span class="p">:</span> <span class="nx">settings.STATIC_ROOT</span><span class="p">,}),</span> + <span class="p">)</span> +</pre></div> + + +<h3 id="template">TEMPLATE<a class="headerlink" href="#template" title="Permanent link">&para;</a></h3> +<p>settings.py </p> +<div class="highlight"><pre><span class="n">TEMPLATE_DIRS</span> <span class="o">=</span> <span class="p">(</span> + <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">templates</span><span class="o">/</span><span class="err">&#39;</span><span class="p">),</span> +<span class="p">)</span> +</pre></div>WonWed, 14 May 2014 00:00:00 +0800tag:wbowam.github.io,2014-05-14:django-dir-pei-zhi-fang-fa-yi.htmlDjangoPEP8 总结http://wbowam.github.io/pep8-zong-jie.html<p>pep8除了是一个标准,也是一个软件包的名字。 <br /> +提供一个pep8检测器。<br /> +运行很简单:pep8 INPUT_FILES ...<br /> +查看帮助:pep8 --help </p> +<p>一般来说,如果要检查代码,pylint和pep8最好都运行一下。pep8只能检测格式,pylint不仅检测格式,还检测语意。 </p> +<p>下文参考总结bobo的日记,感谢前辈分享~~~</p> +<hr /> +<h2 id="_1">一 代码编排<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2> +<p>1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。python3 已经不允许空格和Tab混用了。 <br /> +2 每行最大长度79,换行可以使用反斜杠。换行点要在操作符的后边敲回车。 </p> +<div class="highlight"><pre><span class="n">with</span> <span class="n">open</span><span class="p">(</span><span class="err">&#39;</span><span class="o">/</span><span class="n">path</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">some</span><span class="o">/</span><span class="n">file</span><span class="o">/</span><span class="n">you</span><span class="o">/</span><span class="n">want</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">read</span><span class="err">&#39;</span><span class="p">)</span> <span class="n">as</span> <span class="n">file_1</span><span class="p">,</span> \ + <span class="n">open</span><span class="p">(</span><span class="err">&#39;</span><span class="o">/</span><span class="n">path</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">some</span><span class="o">/</span><span class="n">file</span><span class="o">/</span><span class="n">being</span><span class="o">/</span><span class="n">written</span><span class="err">&#39;</span><span class="p">,</span> <span class="sc">&#39;w&#39;</span><span class="p">)</span> <span class="n">as</span> <span class="n">file_2</span><span class="o">:</span> + <span class="n">file_2</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">file_1</span><span class="p">.</span><span class="n">read</span><span class="p">())</span> +</pre></div> + + +<p>3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。<br /> +4 和括号开始的部分对齐: </p> +<div class="highlight"><pre><span class="nx">foo</span> <span class="o">=</span> <span class="nx">long_function_name</span><span class="p">(</span><span class="nx">var_one</span><span class="p">,</span> <span class="nx">var_two</span><span class="p">,</span> + <span class="nx">var_three</span><span class="p">,</span> <span class="nx">var_four</span><span class="p">)</span> + +<span class="err">#需要更多一层的缩进</span> +<span class="nx">def</span> <span class="nx">long_function_name</span><span class="p">(</span> + <span class="nx">var_one</span><span class="p">,</span> <span class="nx">var_two</span><span class="p">,</span> <span class="nx">var_three</span><span class="p">,</span> + <span class="nx">var_four</span><span class="p">)</span><span class="o">:</span> + <span class="nx">print</span><span class="p">(</span><span class="nx">var_one</span><span class="p">)</span> +<span class="err">##</span> <span class="err">千万不能与下一个代码行对齐。。。。</span> +</pre></div> + + +<p>5 在闭合的括号中不要加空格</p> +<div class="highlight"><pre><span class="nx">my_list</span> <span class="o">=</span> <span class="cp">[</span> + <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> + <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> +<span class="cp">]</span> +<span class="nx">result</span> <span class="o">=</span> <span class="nx">some_function_that_takes_arguments</span><span class="p">(</span> + <span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span><span class="p">,</span> <span class="s1">&#39;c&#39;</span><span class="p">,</span> + <span class="s1">&#39;d&#39;</span><span class="p">,</span> <span class="s1">&#39;e&#39;</span><span class="p">,</span> <span class="s1">&#39;f&#39;</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> + + +<h3 id="_2">二 文档编排<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p>1 模块内容的顺序:模块说明和docstring—import—globals&amp;constants(静态或全局变量)—其他定义。 <br /> + 使用绝对路径import,不用import * ,可能会导入到名字相同的冲突的包 <br /> + 包含顺序也有讲究,顺序如下(他们之间最好加一个换行): + * 标准库 + * 第三方库 + * 本地的应用或者库 <br /> +2 不要在一句import中多个库,比如import os, sys不推荐。 <br /> +3 如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。 </p> +<h3 id="_3">三 空格的使用<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre> <span class="err">总体原则,避免不必要的空格。</span> +</pre></div> + + +<p>1 各种右括号前不要加空格。<br /> +2 逗号、冒号、分号前不要加空格。 </p> +<div class="highlight"><pre><span class="n">Yes</span><span class="o">:</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">4</span><span class="o">:</span> <span class="n">print</span> <span class="n">x</span><span class="o">,</span> <span class="n">y</span><span class="o">;</span> <span class="n">x</span><span class="o">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span><span class="o">,</span> <span class="n">x</span> +<span class="n">No</span><span class="o">:</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">4</span> <span class="o">:</span> <span class="n">print</span> <span class="n">x</span> <span class="o">,</span> <span class="n">y</span> <span class="o">;</span> <span class="n">x</span> <span class="o">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="o">,</span> <span class="n">x</span> +</pre></div> + + +<p>3 函数的左括号前不要加空格。如Func(1)。序列的左括号前不要加空格。如list[2]。 <br /> +4 不要为了对齐增加空格。 <br /> +5 <strong>操作符左右各加一个空格.</strong> <br /> +6 缺省值等号两边无空格: </p> +<div class="highlight"><pre><span class="n">def</span> <span class="n">connect</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">None</span><span class="p">)</span><span class="o">:</span> + <span class="n">self</span><span class="p">.</span><span class="n">_user</span> <span class="o">=</span> <span class="n">user</span> +</pre></div> + + +<p>7 不要将多句语句写在同一行,尽管使用‘;’允许。<br /> +8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。 </p> +<h3 id="_4">四 注释<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre> <span class="err">总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!</span> + <span class="err">注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。</span> + <span class="err">如果是短语,可以省略结束符。</span> +</pre></div> + + +<p>1 块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。比如: </p> +<div class="highlight"><pre><span class="c"># Description : Module config.</span> +<span class="c"># </span> +<span class="c"># Input : None</span> +<span class="c">#</span> +<span class="c"># Output : None</span> +</pre></div> + + +<p>2 行注释,在一句代码后加注释。比如:x = x + 1 # Increment x<br /> +但是这种方式尽量少使用。<br /> +3 避免无谓的注释。 </p> +<h3 id="_5">五 命名规范<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3> +<p>1 常量 : 大写加下划线 </p> +<div class="highlight"><pre><span class="n">STATUS</span> <span class="o">=</span> <span class="p">{</span> + <span class="mi">0</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;正常&#39;</span><span class="p">,</span> + <span class="mi">1</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;草稿&#39;</span><span class="p">,</span> + <span class="mi">2</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;删除&#39;</span><span class="p">,</span> +<span class="p">}</span> + +<span class="cp"># 加下划线</span> +<span class="n">POST_STATUS</span> <span class="o">=</span> <span class="p">{</span> + <span class="mi">0</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;正常&#39;</span><span class="p">,</span> + <span class="mi">1</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;草稿&#39;</span><span class="p">,</span> + <span class="mi">2</span><span class="o">:</span> <span class="n">u</span><span class="err">&#39;删除&#39;</span><span class="p">,</span> +<span class="p">}</span> +</pre></div> + + +<p>2 类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写。类名应该简明,精确. </p> +<div class="highlight"><pre><span class="n">class</span> <span class="n">UserProfile</span><span class="p">(</span><span class="n">BaseProfile</span><span class="p">)</span><span class="o">:</span> + <span class="n">def</span> <span class="n">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">profile</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">_profile</span> <span class="o">=</span> <span class="n">profile</span> + + <span class="n">def</span> <span class="n">profile</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">_profile</span> +</pre></div> + + +<p>3 模块和包.除特殊模块 <strong>init</strong> 之外,模块名称都使用不带下划线的小写字母。<br /> +若是它们实现一个协议,那么通常使用lib为后缀,例如: </p> +<div class="highlight"><pre><span class="n">import</span> <span class="n">smtplib</span> +<span class="n">import</span> <span class="n">os</span> +<span class="n">import</span> <span class="n">sys</span> +</pre></div> + + +<h5 id="_6">分行包含:<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">Yes</span><span class="o">:</span> <span class="k">import</span> <span class="nn">os</span> + <span class="k">import</span> <span class="nn">sys</span> + +<span class="n">No</span><span class="o">:</span> <span class="k">import</span> <span class="nn">sys</span><span class="o">,</span> <span class="n">os</span> +</pre></div> + + +<h5 id="_7">下面的也可以:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">subprocess</span> <span class="n">import</span> <span class="n">Popen</span><span class="p">,</span> <span class="n">PIPE</span> +</pre></div> + + +<p>4 使用 has 或 is 前缀命名布尔元素 </p> +<div class="highlight"><pre><span class="n">is_connect</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">has_member</span> <span class="o">=</span> <span class="n">False</span> +</pre></div> + + +<p>5 用复数形式命名序列 </p> +<div class="highlight"><pre><span class="n">members</span> <span class="o">=</span> <span class="p">[</span><span class="err">&#39;</span><span class="n">user_1</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">user_2</span><span class="err">&#39;</span><span class="p">]</span> +</pre></div> + + +<p>6 避免通用名称,避免现有名称 <br /> +诸如 list, dict, sequence 或者 element 这样的名称应该避免<br /> +诸如 os, sys 这种系统已经存在的名称应该避免。 </p> +<p>7 异常名:加入后缀Error<br /> +8 函数名:小写+下划线<br /> +9 函数和方法的参数:实例使用self 开始,类使用cls 开始。如果和系统参数名重复,在其后加_ </p> +<h3 id="_8">六 验证脚本<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h3> +<p>可以安装一个 pep8 脚本用于验证你的代码风格是否符合 PEP8。</p> +<div class="highlight"><pre><span class="n">pip</span> <span class="n">install</span> <span class="n">pep8</span> +<span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">upgrade</span> <span class="n">pep8</span> +<span class="n">pip</span> <span class="n">uninstall</span> <span class="n">pep8</span> +</pre></div> + + +<p>Example usage and output</p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">pep8</span> <span class="o">--</span><span class="n">first</span> <span class="n">optparse</span><span class="p">.</span><span class="n">py</span> +<span class="cp"># 也可以传一个文件夹,pep8 --first apps/ </span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">69</span><span class="o">:</span><span class="mi">11</span><span class="o">:</span> <span class="n">E401</span> <span class="n">multiple</span> <span class="n">imports</span> <span class="n">on</span> <span class="n">one</span> <span class="n">line</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">77</span><span class="o">:</span><span class="mi">1</span><span class="o">:</span> <span class="n">E302</span> <span class="n">expected</span> <span class="mi">2</span> <span class="n">blank</span> <span class="n">lines</span><span class="p">,</span> <span class="n">found</span> <span class="mi">1</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">88</span><span class="o">:</span><span class="mi">5</span><span class="o">:</span> <span class="n">E301</span> <span class="n">expected</span> <span class="mi">1</span> <span class="n">blank</span> <span class="n">line</span><span class="p">,</span> <span class="n">found</span> <span class="mi">0</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">222</span><span class="o">:</span><span class="mi">34</span><span class="o">:</span> <span class="n">W602</span> <span class="n">deprecated</span> <span class="n">form</span> <span class="n">of</span> <span class="n">raising</span> <span class="n">exception</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">347</span><span class="o">:</span><span class="mi">31</span><span class="o">:</span> <span class="n">E211</span> <span class="n">whitespace</span> <span class="n">before</span> <span class="sc">&#39;(&#39;</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">357</span><span class="o">:</span><span class="mi">17</span><span class="o">:</span> <span class="n">E201</span> <span class="n">whitespace</span> <span class="n">after</span> <span class="sc">&#39;{&#39;</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">472</span><span class="o">:</span><span class="mi">29</span><span class="o">:</span> <span class="n">E221</span> <span class="n">multiple</span> <span class="n">spaces</span> <span class="n">before</span> <span class="n">operator</span> +<span class="n">optparse</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">544</span><span class="o">:</span><span class="mi">21</span><span class="o">:</span> <span class="n">W601</span> <span class="p">.</span><span class="n">has_key</span><span class="p">()</span> <span class="n">is</span> <span class="n">deprecated</span><span class="p">,</span> <span class="n">use</span> <span class="err">&#39;</span><span class="n">in</span><span class="err">&#39;</span> +</pre></div> + + +<p>You can also make pep8.py show the source code for each error, and even the relevant text from PEP 8: </p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">pep8</span> <span class="o">--</span><span class="n">show</span><span class="o">-</span><span class="n">source</span> <span class="o">--</span><span class="n">show</span><span class="o">-</span><span class="n">pep8</span> <span class="n">testsuite</span><span class="o">/</span><span class="n">E40</span><span class="p">.</span><span class="n">py</span> +<span class="n">testsuite</span><span class="o">/</span><span class="n">E40</span><span class="p">.</span><span class="n">py</span><span class="o">:</span><span class="mi">2</span><span class="o">:</span><span class="mi">10</span><span class="o">:</span> <span class="n">E401</span> <span class="n">multiple</span> <span class="n">imports</span> <span class="n">on</span> <span class="n">one</span> <span class="n">line</span> +<span class="n">import</span> <span class="n">os</span><span class="p">,</span> <span class="n">sys</span> + <span class="o">^</span> + <span class="n">Imports</span> <span class="n">should</span> <span class="n">usually</span> <span class="n">be</span> <span class="n">on</span> <span class="n">separate</span> <span class="n">lines</span><span class="p">.</span> + + <span class="nl">Okay:</span> <span class="n">import</span> <span class="n">os</span><span class="err">\</span><span class="n">nimport</span> <span class="n">sys</span> + <span class="nl">E401:</span> <span class="n">import</span> <span class="n">sys</span><span class="p">,</span> <span class="n">os</span> +</pre></div> + + +<h6 id="sublime2autopep8">你也可以装上sublime2插件<code>AutoPEP8</code>,右键即可规范代码<a class="headerlink" href="#sublime2autopep8" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="nl">AutoPEP8:</span> +<span class="o">--------</span> + + <span class="n">Sublime</span> <span class="n">Auto</span> <span class="n">PEP8</span> <span class="n">Formatting</span> + <span class="p">(</span><span class="n">https</span><span class="o">:</span><span class="c1">//github.com/wistful/SublimeAutoPEP8)</span> + + <span class="n">Automatically</span> <span class="n">formats</span> <span class="n">Python</span> <span class="n">code</span> <span class="n">to</span> <span class="n">conform</span> <span class="n">to</span> <span class="n">the</span> <span class="n">PEP</span> <span class="mi">8</span> <span class="n">style</span> <span class="n">guide</span> <span class="n">using</span> <span class="n">autopep8</span> <span class="n">module</span> + <span class="n">Support</span> <span class="n">ST2</span> <span class="n">and</span> <span class="n">ST3</span> + + <span class="nl">Features:</span> + <span class="n">format</span> <span class="o">/</span> <span class="n">preview</span> <span class="n">code</span> <span class="n">according</span> <span class="n">PEP8</span> + <span class="n">format</span> <span class="o">/</span> <span class="n">preview</span> <span class="n">selected</span> <span class="n">text</span> + <span class="n">format</span> <span class="o">/</span> <span class="n">preview</span> <span class="n">all</span> <span class="n">python</span> <span class="n">modules</span> <span class="n">in</span> <span class="n">folder</span> + <span class="n">side</span> <span class="n">bar</span> <span class="n">menu</span> + <span class="n">formated</span> <span class="n">code</span> <span class="k">while</span> <span class="n">saving</span> + + <span class="nl">Using:</span> + <span class="n">SideBar</span> <span class="o">-</span> <span class="n">right</span> <span class="n">click</span> <span class="n">on</span> <span class="n">the</span> <span class="n">file</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="n">or</span> <span class="n">folder</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> + <span class="n">Active</span> <span class="n">view</span> <span class="o">-</span> <span class="n">right</span> <span class="n">click</span> <span class="n">on</span> <span class="n">the</span> <span class="n">view</span> + <span class="n">Selected</span> <span class="n">text</span> <span class="o">-</span> <span class="n">right</span> <span class="n">click</span> <span class="n">on</span> <span class="n">the</span> <span class="n">selected</span> <span class="n">text</span> + <span class="n">On</span> <span class="n">Save</span> <span class="o">-</span> <span class="n">provide</span> <span class="n">by</span> <span class="n">settings</span><span class="o">:</span> <span class="n">option</span> <span class="n">format_on_save</span> + <span class="n">Command</span> <span class="n">Palette</span> <span class="o">-</span> <span class="n">bring</span> <span class="n">up</span> <span class="n">the</span> <span class="n">Command</span> <span class="n">Palette</span> <span class="n">and</span> <span class="n">select</span> <span class="err">`</span><span class="n">PEP8</span><span class="o">:</span> <span class="n">Format</span> <span class="n">Code</span><span class="err">`</span> <span class="n">or</span> <span class="err">`</span><span class="n">PEP8</span><span class="o">:</span> <span class="n">Preview</span> <span class="n">Changes</span><span class="err">`</span> + <span class="n">Hotkeys</span> <span class="o">-</span> <span class="err">`</span><span class="n">Command</span><span class="o">/</span><span class="n">Control</span> <span class="o">+</span> <span class="n">Shift</span> <span class="o">+</span> <span class="mi">8</span><span class="err">`</span> <span class="n">to</span> <span class="n">format</span> <span class="n">code</span><span class="p">,</span> <span class="err">`</span><span class="n">Command</span><span class="o">/</span><span class="n">Control</span> <span class="o">+</span> <span class="mi">8</span><span class="err">`</span> <span class="n">to</span> <span class="n">preview</span> <span class="n">changes</span> +</pre></div> + + +<h3 id="_9">七 源码文件的编码<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h3> +<p>python2 默认ASCII ,python3 默认utf8 <br /> +都用utf8省事 </p>WonWed, 14 May 2014 00:00:00 +0800tag:wbowam.github.io,2014-05-14:pep8-zong-jie.htmlDjango,python用Django mptt后台中生成树状数据结构http://wbowam.github.io/yong-django-mptthou-tai-zhong-sheng-cheng-shu-zhuang-shu-ju-jie-gou.html<h3 id="_1">背景说明:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>昨天跟客户谈需求时,客户要求做一个数状数据结构,类似于:<br /> +<img alt="树状数据" src="http://tulparblog.qiniudn.com/mpttsitepoint_tree.jpg" /></p> +<h5 id="_2">不仅要在前台这么显示,后台也要这么显示。<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h5> +<p>一番google之后 ,感谢Stack Overflow让我找到了Django mptt,感谢<a href="http://qinxuye.me/article/introduction-and-usage-of-django-mptt/">残阳似血</a>血写了如此华丽的博客,小生很喜欢添加趣点功能</p> +<hr /> +<h3 id="_3">解决方案<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<h5 id="django-mptt">用django mptt改变数据结构<a class="headerlink" href="#django-mptt" title="Permanent link">&para;</a></h5> +<h5 id="django-mptt-admindjango">用django-mptt-admin改变数状结构在django后台的显示方式<a class="headerlink" href="#django-mptt-admindjango" title="Permanent link">&para;</a></h5> +<h3 id="_4">具体操作<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<h4 id="1-django-mptt">1. 安装django mptt<a class="headerlink" href="#1-django-mptt" title="Permanent link">&para;</a></h4> +<p>下载源码 <code>https://github.com/django-mptt/django-mptt</code> +<em>或</em> +<code>pip install django-mptt</code></p> +<h4 id="2-django-mptt">2. 配置django mptt<a class="headerlink" href="#2-django-mptt" title="Permanent link">&para;</a></h4> +<p>在settings文件下的INSTALLED_APPS中添加'mptt'<br /> +<em>就这么简单,安装配置结束了</em></p> +<h4 id="3-django-mptt">3. 使用django mptt<a class="headerlink" href="#3-django-mptt" title="Permanent link">&para;</a></h4> +<h5 id="modelmpttmodel">写model,继承MPTTModel<a class="headerlink" href="#modelmpttmodel" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">mptt</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">MPTTModel</span> +<span class="n">class</span> <span class="n">MPTTFood</span><span class="p">(</span><span class="n">MPTTModel</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">50</span><span class="p">)</span> + <span class="n">parent</span> <span class="o">=</span> <span class="n">TreeForeignKey</span><span class="p">(</span><span class="s">&quot;self&quot;</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="n">True</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s">&quot;children&quot;</span><span class="p">)</span> + + <span class="n">def</span> <span class="n">__unicode__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">title</span> +</pre></div> + + +<h6 id="parentmptt">注:理论上,不一定用“parent“去跟字段的名字,MPTT元类中指明即可,如<a class="headerlink" href="#parentmptt" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="n">from</span> <span class="n">mptt</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">MPTTModel</span> + +<span class="n">class</span> <span class="n">MPTTFood</span><span class="p">(</span><span class="n">MPTTModel</span><span class="p">)</span><span class="o">:</span> + <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">50</span><span class="p">)</span> + <span class="n">parent_food</span> <span class="o">=</span> <span class="n">TreeForeignKey</span><span class="p">(</span><span class="s">&quot;self&quot;</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="n">True</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s">&quot;children&quot;</span><span class="p">)</span> + + <span class="n">class</span> <span class="n">MPTTMeta</span><span class="o">:</span> + <span class="n">parent_attr</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">parent_food</span><span class="err">&#39;</span> + + <span class="n">def</span> <span class="n">__unicode__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span><span class="o">:</span> + <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">title</span> +</pre></div> + + +<h6 id="parent">但强烈建议,如果能用就用“parent”<a class="headerlink" href="#parent" title="Permanent link">&para;</a></h6> +<h5 id="adminpy">写admin.py,注册<a class="headerlink" href="#adminpy" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span> <span class="n">import</span> <span class="n">admin</span> +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">MPTTFood</span> + + +<span class="n">class</span> <span class="n">MPTTFoodAdmin</span><span class="p">(</span><span class="n">admin</span><span class="p">.</span><span class="n">ModelAdmin</span><span class="p">)</span><span class="o">:</span> + <span class="n">tree_auto_open</span> <span class="o">=</span> <span class="mi">0</span> + <span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,)</span> + <span class="n">ordering</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,)</span> + + + +<span class="n">admin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">MPTTFood</span><span class="p">,</span><span class="n">MPTTFoodAdmin</span><span class="p">)</span> +</pre></div> + + +<p><em>有关mptt已经结束,关于在前台怎么用数状数据,请看官方文档</em></p> +<h4 id="4-django-mptt-admin">4. 安装django-mptt-admin<a class="headerlink" href="#4-django-mptt-admin" title="Permanent link">&para;</a></h4> +<p><code>pip install django_mptt_admin</code> +或 <br /> +下载源码<code>https://github.com/leukeleu/django-mptt-admin</code></p> +<h4 id="5-django-mptt-admin">5.配置 django-mptt-admin<a class="headerlink" href="#5-django-mptt-admin" title="Permanent link">&para;</a></h4> +<p>Add django_mptt_admin to your installed apps in settings.py</p> +<h5 id="6-django-mptt-admin">6.使用 django-mptt-admin<a class="headerlink" href="#6-django-mptt-admin" title="Permanent link">&para;</a></h5> +<p>只要在admin.py里继承DjangoMpttAdmin即可</p> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span> <span class="n">import</span> <span class="n">admin</span> +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">MPTTFood</span> +<span class="n">from</span> <span class="n">django_mptt_admin</span><span class="p">.</span><span class="n">admin</span> <span class="n">import</span> <span class="n">DjangoMpttAdmin</span> + + +<span class="n">class</span> <span class="n">MPTTFoodAdmin</span><span class="p">(</span><span class="n">DjangoMpttAdmin</span><span class="p">)</span><span class="o">:</span> + <span class="n">tree_auto_open</span> <span class="o">=</span> <span class="mi">0</span> + <span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,)</span> + <span class="n">ordering</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">title</span><span class="err">&#39;</span><span class="p">,)</span> + +<span class="n">admin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">MPTTFood</span><span class="p">,</span><span class="n">MPTTFoodAdmin</span><span class="p">)</span> +</pre></div> + + +<hr /> +<p>That's All</p>WonWed, 16 Apr 2014 00:00:00 +0800tag:wbowam.github.io,2014-04-16:yong-django-mptthou-tai-zhong-sheng-cheng-shu-zhuang-shu-ju-jie-gou.htmlDjangoEdx_errorshttp://wbowam.github.io/edx_errors.html<h3 id="1-vagrantvirtualboxubuntuedxpaltform">1. 用Vagrant+Virtualbox+Ubuntu搭好Edx—paltform,执行启动命令:<a class="headerlink" href="#1-vagrantvirtualboxubuntuedxpaltform" title="Permanent link">&para;</a></h3> +<p><code>vagrant up</code></p> +<h4 id="_1">错误:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="s">&quot;The guest machine entered an invalid state while waiting for it to boot. </span> +<span class="n">Valid</span> <span class="n">states</span> <span class="n">are</span> <span class="err">&#39;</span><span class="n">starting</span><span class="p">,</span> <span class="n">running</span><span class="err">&#39;</span><span class="p">.</span> <span class="n">The</span> <span class="n">machine</span> <span class="n">is</span> <span class="n">in</span> <span class="n">the</span> <span class="err">&#39;</span><span class="n">poweroff</span><span class="err">&#39;</span> <span class="n">state</span><span class="p">.</span> + <span class="n">Please</span> <span class="n">verify</span> <span class="n">everything</span> <span class="n">is</span> <span class="n">configured</span> <span class="n">properly</span> <span class="n">and</span> <span class="n">try</span> <span class="n">again</span><span class="p">.</span><span class="s">&quot; </span> +</pre></div> + + +<h4 id="_2">原因:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<p><strong>这是因为CPU不支持VT-X技术或者VT-X技术被锁定。</strong> </p> +<p>如果不打开虚拟化支持,是不能在虚拟机装<strong>64位操作系统</strong>或者安装操作系统设置<strong>多个CPU</strong>,如果安装32位操作系统只设置一个CPU,则不会出现上述错误。 </p> +<h4 id="_3">解决方案一<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4> +<p>VT-X是Intel CPU虚拟化技术,<strong>查看CPU是否支持VT-x技术:</strong> </p> +<div class="highlight"><pre><span class="n">cat</span> <span class="o">/</span><span class="n">proc</span><span class="o">/</span><span class="n">cpuinfo</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">flags</span> +</pre></div> + + +<p>如果存在 vmx 选项,则说明支持。<br /> +设置CPU开启VT-x技术。</p> +<p><strong>开机进入BIOS选项 ,依次选Config-&gt;CPU-&gt;Intel Virtualization Technology,里面有个Intel VT-d Feature ,改成Enabled ,保存退出,关机,然后启动机器。</strong></p> +<h4 id="_4">解决方案二<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h4> +<p>改虚拟机配置:<br /> +<code>vim Vagrantfile</code> +即改CPU</p> +<div class="highlight"><pre><span class="n">CPU_COUNT</span> <span class="o">=</span> <span class="mi">1</span> +</pre></div> + + +<hr /> +<hr /> +<h3 id="2vagrantvirtualboxubuntuedxpaltformvagrant-ssh">2.用Vagrant+Virtualbox+Ubuntu搭好Edx—paltform,执行启动命令:<code>vagrant ssh</code><a class="headerlink" href="#2vagrantvirtualboxubuntuedxpaltformvagrant-ssh" title="Permanent link">&para;</a></h3> +<h4 id="_5">错误:<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4> +<p><code>ssh_exchange_identification: Connection closed by remote host</code></p> +<h4 id="_6">原因:<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h4> +<p>典型的tcp_wrapper配置了不允许你这个ip登录ssh</p> +<h4 id="_7">解决方案:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h4> +<p><strong>让/etc/hosts.allow 和/etc/hosts.deny里面的所有信息都不生效,全部注销掉,重启SSH服务</strong></p> +<p><a href="http://www.zhihu.com/question/20023544">参考</a></p> +<h3 id="3-edx-platformvagrant-up">3. 阿里云上部署好Edx-platform后,vagrant up 报了一些错<a class="headerlink" href="#3-edx-platformvagrant-up" title="Permanent link">&para;</a></h3> +<h4 id="_8">第一个错误:语法错误<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h4> +<h5 id="vagrant-101">原因:vagrant 版本过低(因为阿里云的源只有1.0.1版)<a class="headerlink" href="#vagrant-101" title="Permanent link">&para;</a></h5> +<h5 id="_9">解决方案:<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h5> +<p>Go to the downloads page of Vagrant and check for the latest release. Once you are looking at the different versions of the latest release, right click over the one with the .deb extension and copy the link address. Then head back to your terminal and run the following command:</p> +<div class="highlight"><pre><span class="n">wget</span> <span class="n">http</span><span class="o">:</span><span class="c1">//files.vagrantup.com/packages/0219bb87725aac28a97c0e924c310cc97831fd9d/vagrant_1.2.4_i686.deb</span> +</pre></div> + + +<p>Replace the URL you see above (following the wget command) with the one you just copied. This will download Vagrant to your system. Next, install the package with the following command:</p> +<div class="highlight"><pre><span class="n">dpkg</span> <span class="o">-</span><span class="n">i</span> <span class="n">vagrant_1</span><span class="mf">.2.4</span><span class="n">_i686</span><span class="p">.</span><span class="n">deb</span> +</pre></div> + + +<div class="highlight"><pre><span class="n">VirtualBox</span> <span class="n">is</span> <span class="n">complaining</span> <span class="n">that</span> <span class="n">the</span> <span class="n">installation</span> <span class="n">is</span> <span class="n">incomplete</span><span class="p">.</span> <span class="n">Please</span> +<span class="n">run</span> <span class="err">`</span><span class="n">VBoxManage</span> <span class="o">--</span><span class="n">version</span><span class="err">`</span> <span class="n">to</span> <span class="n">see</span> <span class="n">the</span> <span class="n">error</span> <span class="n">message</span> <span class="n">which</span> <span class="n">should</span> <span class="n">contain</span> +<span class="n">instructions</span> <span class="n">on</span> <span class="n">how</span> <span class="n">to</span> <span class="n">fix</span> <span class="n">this</span> <span class="n">error</span><span class="p">.</span> +</pre></div> + + +<hr /> +<h6 id="_10"># <em>下面问题的解决方案,被作者怀疑,准确性有待考察,请小伙伴们慎用!</em><a class="headerlink" href="#_10" title="Permanent link">&para;</a></h6> +<hr /> +<h4 id="_11">第二个错误:<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">VirtualBox</span> <span class="n">is</span> <span class="n">complaining</span> <span class="n">that</span> <span class="n">the</span> <span class="n">installation</span> <span class="n">is</span> <span class="n">incomplete</span><span class="p">.</span> <span class="n">Please</span> +<span class="n">run</span> <span class="err">`</span><span class="n">VBoxManage</span> <span class="o">--</span><span class="n">version</span><span class="err">`</span> <span class="n">to</span> <span class="n">see</span> <span class="n">the</span> <span class="n">error</span> <span class="n">message</span> <span class="n">which</span> <span class="n">should</span> <span class="n">contain</span> +<span class="n">instructions</span> <span class="n">on</span> <span class="n">how</span> <span class="n">to</span> <span class="n">fix</span> <span class="n">this</span> <span class="n">error</span><span class="p">.</span> +</pre></div> + + +<h5 id="_12">解决方案<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">dpkg</span><span class="o">-</span><span class="n">dev</span> <span class="n">virtualbox</span><span class="o">-</span><span class="n">dkms</span> +</pre></div> + + +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">linux</span><span class="o">-</span><span class="n">headers</span><span class="o">-</span><span class="err">$</span><span class="p">(</span><span class="n">uname</span> <span class="o">-</span><span class="n">r</span><span class="p">)</span> +</pre></div> + + +<p><code>sudo dpkg-reconfigure virtualbox-dkms</code></p> +<hr /> +<h6 id="_13"># <em>上面问题的解决方案,被作者怀疑,准确性有待考察,请小伙伴们慎用!</em><a class="headerlink" href="#_13" title="Permanent link">&para;</a></h6> +<hr /> +<h3 id="4vagrant-up">4.阿里云上部署好,vagrant up<a class="headerlink" href="#4vagrant-up" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">wwj</span><span class="err">@</span><span class="n">AY14051916372845353bZ</span><span class="o">:~/</span><span class="n">fullstack</span><span class="err">$</span> <span class="n">vagrant</span> <span class="n">up</span> +<span class="n">Bringing</span> <span class="n">machine</span> <span class="err">&#39;</span><span class="k">default</span><span class="err">&#39;</span> <span class="n">up</span> <span class="n">with</span> <span class="err">&#39;</span><span class="n">virtualbox</span><span class="err">&#39;</span> <span class="n">provider</span><span class="p">...</span> +<span class="o">==&gt;</span> <span class="k">default</span><span class="o">:</span> <span class="n">Box</span> <span class="err">&#39;</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="err">&#39;</span> <span class="n">could</span> <span class="n">not</span> <span class="n">be</span> <span class="n">found</span><span class="p">.</span> <span class="n">Attempting</span> <span class="n">to</span> <span class="n">find</span> <span class="n">and</span> <span class="n">install</span><span class="p">...</span> + <span class="nl">default:</span> <span class="n">Box</span> <span class="n">Provider</span><span class="o">:</span> <span class="n">virtualbox</span> + <span class="nl">default:</span> <span class="n">Box</span> <span class="n">Version</span><span class="o">:</span> <span class="o">&gt;=</span> <span class="mi">0</span> +<span class="o">==&gt;</span> <span class="k">default</span><span class="o">:</span> <span class="n">Adding</span> <span class="n">box</span> <span class="err">&#39;</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="err">&#39;</span> <span class="p">(</span><span class="n">v0</span><span class="p">)</span> <span class="k">for</span> <span class="n">provider</span><span class="o">:</span> <span class="n">virtualbox</span> + <span class="nl">default:</span> <span class="n">Downloading</span><span class="o">:</span> <span class="n">file</span><span class="o">:</span><span class="c1">///home/wwj/fullstack/20140418-injera-fullstack.box</span> +<span class="n">The</span> <span class="n">box</span> <span class="n">failed</span> <span class="n">to</span> <span class="n">unpackage</span> <span class="n">properly</span><span class="p">.</span> <span class="n">Please</span> <span class="n">verify</span> <span class="n">that</span> <span class="n">the</span> <span class="n">box</span> +<span class="n">file</span> <span class="n">you</span><span class="err">&#39;</span><span class="n">re</span> <span class="n">trying</span> <span class="n">to</span> <span class="n">add</span> <span class="n">is</span> <span class="n">not</span> <span class="n">corrupted</span> <span class="n">and</span> <span class="n">try</span> <span class="n">again</span><span class="p">.</span> <span class="n">The</span> +<span class="n">output</span> <span class="n">from</span> <span class="n">attempting</span> <span class="n">to</span> <span class="n">unpackage</span> <span class="p">(</span><span class="k">if</span> <span class="n">any</span><span class="p">)</span><span class="o">:</span> + +<span class="nl">bsdtar:</span> <span class="n">Failed</span> <span class="n">to</span> <span class="n">set</span> <span class="k">default</span> <span class="n">locale</span> +<span class="n">x</span> <span class="p">.</span><span class="o">/</span><span class="n">Vagrantfile</span> +<span class="n">x</span> <span class="p">.</span><span class="o">/</span><span class="n">box</span><span class="o">-</span><span class="n">disk1</span><span class="p">.</span><span class="n">vmdk</span><span class="o">:</span> <span class="n">Write</span> <span class="n">failed</span> +<span class="n">x</span> <span class="p">.</span><span class="o">/</span><span class="n">box</span><span class="p">.</span><span class="n">ovf</span><span class="o">:</span> <span class="n">Write</span> <span class="n">failed</span> +<span class="nl">bsdtar:</span> <span class="n">Error</span> <span class="n">exit</span> <span class="n">delayed</span> <span class="n">from</span> <span class="n">previous</span> <span class="n">errors</span><span class="p">.</span> +</pre></div> + + +<hr /> +<h3 id="5edx-platformvagrant-up">5.阿里云上部署Edx-platform,vagrant up后,<a class="headerlink" href="#5edx-platformvagrant-up" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">An</span> <span class="n">error</span> <span class="n">occurred</span> <span class="k">while</span> <span class="n">downloading</span> <span class="n">the</span> <span class="n">remote</span> <span class="n">file</span><span class="p">.</span> <span class="n">The</span> <span class="n">error</span> +<span class="n">message</span><span class="p">,</span> <span class="k">if</span> <span class="n">any</span><span class="p">,</span> <span class="n">is</span> <span class="n">reproduced</span> <span class="n">below</span><span class="p">.</span> <span class="n">Please</span> <span class="n">fix</span> <span class="n">this</span> <span class="n">error</span> <span class="n">and</span> <span class="n">try</span> +<span class="n">again</span><span class="p">.</span> + +<span class="n">Failed</span> <span class="n">writing</span> <span class="n">body</span> <span class="p">(</span><span class="mi">488</span> <span class="o">!=</span> <span class="mi">16383</span><span class="p">)</span> +</pre></div> + + +<h5 id="20g16g">原因:磁盘空间不足,阿里云服务器系统盘只有20G,已用16G,加载虚拟机,开始展开镜像,导致磁盘空间不足<a class="headerlink" href="#20g16g" title="Permanent link">&para;</a></h5> +<h4 id="_14">解决方案:<a class="headerlink" href="#_14" title="Permanent link">&para;</a></h4> +<h5 id="130g">第一步:买了个阿里云130G的数据盘<a class="headerlink" href="#130g" title="Permanent link">&para;</a></h5> +<p>数据盘的挂载及使用,请参考<a href="http://help.aliyun.com/view/11108189_13435365.html?spm=5176.7224609.1997282825.4.ezRjvD">阿里云帮助文档——挂载数据盘</a></p> +<h5 id="vagrantvagrant_home">第二部:更改Vagrant的根目录(VAGRANT_HOME)<a class="headerlink" href="#vagrantvagrant_home" title="Permanent link">&para;</a></h5> +<p>在<code>~/.bashrc</code>中加入: </p> +<div class="highlight"><pre><span class="n">export</span> <span class="n">VAGRANT_HOME</span><span class="o">=/</span><span class="n">path</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">vagrant</span> +</pre></div> + + +<hr /> +<h3 id="6edx-platformvagrant-up">6.阿里云上部署Edx-platform,vagrant up后,<a class="headerlink" href="#6edx-platformvagrant-up" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">vagrant</span> <span class="n">up</span> +<span class="n">Bringing</span> <span class="n">machine</span> <span class="err">&#39;</span><span class="k">default</span><span class="err">&#39;</span> <span class="n">up</span> <span class="n">with</span> <span class="err">&#39;</span><span class="n">virtualbox</span><span class="err">&#39;</span> <span class="n">provider</span><span class="p">...</span> +<span class="o">==&gt;</span> <span class="k">default</span><span class="o">:</span> <span class="n">Box</span> <span class="err">&#39;</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="err">&#39;</span> <span class="n">could</span> <span class="n">not</span> <span class="n">be</span> <span class="n">found</span><span class="p">.</span> <span class="n">Attempting</span> <span class="n">to</span> <span class="n">find</span> <span class="n">and</span> <span class="n">install</span><span class="p">...</span> + <span class="nl">default:</span> <span class="n">Box</span> <span class="n">Provider</span><span class="o">:</span> <span class="n">virtualbox</span> + <span class="nl">default:</span> <span class="n">Box</span> <span class="n">Version</span><span class="o">:</span> <span class="o">&gt;=</span> <span class="mi">0</span> +<span class="o">==&gt;</span> <span class="k">default</span><span class="o">:</span> <span class="n">Adding</span> <span class="n">box</span> <span class="err">&#39;</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="err">&#39;</span> <span class="p">(</span><span class="n">v0</span><span class="p">)</span> <span class="k">for</span> <span class="n">provider</span><span class="o">:</span> <span class="n">virtualbox</span> + <span class="nl">default:</span> <span class="n">Downloading</span><span class="o">:</span> <span class="n">file</span><span class="o">:</span><span class="c1">///home/wwj/fullstack/20140418-injera-fullstack.box.1</span> +<span class="o">==&gt;</span> <span class="k">default</span><span class="o">:</span> <span class="n">Successfully</span> <span class="n">added</span> <span class="n">box</span> <span class="err">&#39;</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="err">&#39;</span> <span class="p">(</span><span class="n">v0</span><span class="p">)</span> <span class="k">for</span> <span class="err">&#39;</span><span class="n">virtualbox</span><span class="err">&#39;</span><span class="o">!</span> +<span class="n">There</span> <span class="n">are</span> <span class="n">errors</span> <span class="n">in</span> <span class="n">the</span> <span class="n">configuration</span> <span class="n">of</span> <span class="n">this</span> <span class="n">machine</span><span class="p">.</span> <span class="n">Please</span> <span class="n">fix</span> +<span class="n">the</span> <span class="n">following</span> <span class="n">errors</span> <span class="n">and</span> <span class="n">try</span> <span class="n">again</span><span class="o">:</span> + +<span class="nl">Vagrant:</span> +<span class="o">*</span> <span class="n">Unknown</span> <span class="n">configuration</span> <span class="n">section</span> <span class="err">&#39;</span><span class="n">hostsupdater</span><span class="err">&#39;</span><span class="p">.</span> +</pre></div> + + +<h4 id="_15">原因:<a class="headerlink" href="#_15" title="Permanent link">&para;</a></h4> +<p><code>vagrant plugin list</code>发现 plugin <code>hostsupdater</code>没了, <br /> +还记得问题5里,我们改了VAGRANT_HOME,但是没copy <code>~/.vagrant.d/</code>因此得重新装一下<code>hostsupdater</code>:<br /> +<code>vagrant plugin install vagrant-hostsupdater</code></p> +<h3 id="7vagrant">7.vagrant<a class="headerlink" href="#7vagrant" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">vagrant</span> <span class="o">-</span><span class="n">v</span> +<span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">vagrant</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">vagrant</span><span class="o">:</span> <span class="n">line</span> <span class="mi">64</span><span class="o">:</span> +<span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">vagrant</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="p">..</span><span class="o">/</span><span class="n">embedded</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">ruby</span><span class="o">:</span> <span class="n">No</span> <span class="n">such</span> <span class="n">file</span> <span class="n">or</span> <span class="n">directory</span> +</pre></div> + + +<h4 id="_16">原因:装错包了<a class="headerlink" href="#_16" title="Permanent link">&para;</a></h4> +<p><code>i686.deb</code>不是<code>64位的意思</code></p> +<h4 id="vagrant_x86_64debvagrant_i686deb">解决方案:装vagrant_x86_64.deb而不是vagrant_i686.deb<a class="headerlink" href="#vagrant_x86_64debvagrant_i686deb" title="Permanent link">&para;</a></h4> +<p><a href="https://github.com/mitchellh/vagrant/issues/1559">参考</a></p> +<h3 id="8">8.<a class="headerlink" href="#8" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">WARNING</span><span class="o">:</span> <span class="n">The</span> <span class="n">vboxdrv</span> <span class="n">kernel</span> <span class="n">module</span> <span class="k">is</span> <span class="n">not</span> <span class="n">loaded</span><span class="o">.</span> <span class="n">Either</span> <span class="n">there</span> <span class="k">is</span> <span class="n">no</span> <span class="n">module</span> + <span class="n">available</span> <span class="k">for</span> <span class="n">the</span> <span class="n">current</span> <span class="n">kernel</span> <span class="o">(</span><span class="mf">3.2</span><span class="o">.</span><span class="mi">0</span><span class="o">-</span><span class="mi">29</span><span class="o">-</span><span class="n">generic</span><span class="o">)</span> <span class="n">or</span> <span class="n">it</span> <span class="n">failed</span> <span class="n">to</span> + <span class="n">load</span><span class="o">.</span> <span class="n">Please</span> <span class="n">recompile</span> <span class="n">the</span> <span class="n">kernel</span> <span class="n">module</span> <span class="n">and</span> <span class="n">install</span> <span class="n">it</span> <span class="n">by</span> + + <span class="n">sudo</span> <span class="sr">/etc/init.d/</span><span class="n">vboxdrv</span> <span class="n">setup</span> + + <span class="n">You</span> <span class="n">will</span> <span class="n">not</span> <span class="n">be</span> <span class="n">able</span> <span class="n">to</span> <span class="n">start</span> <span class="n">VMs</span> <span class="n">until</span> <span class="k">this</span> <span class="n">problem</span> <span class="k">is</span> <span class="n">fixed</span><span class="o">.</span> +<span class="mf">4.3</span><span class="o">.</span><span class="mi">12</span><span class="n">r93733</span> +</pre></div> + + +<h4 id="_17">原因:<a class="headerlink" href="#_17" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">he</span> <span class="n">vboxdrv</span> <span class="n">kernel</span> <span class="n">module</span> <span class="n">is</span> <span class="n">not</span> <span class="n">loaded</span><span class="p">.</span> <span class="n">Either</span> <span class="n">there</span> <span class="n">is</span> <span class="n">no</span> <span class="n">module</span> + <span class="n">available</span> <span class="k">for</span> <span class="n">the</span> <span class="n">current</span> <span class="n">kernel</span> <span class="p">(</span><span class="mf">3.2.0</span><span class="o">-</span><span class="mi">29</span><span class="o">-</span><span class="n">generic</span><span class="p">)</span> <span class="n">or</span> <span class="n">it</span> <span class="n">failed</span> <span class="n">to</span> + <span class="n">load</span><span class="p">.</span> <span class="n">Please</span> <span class="n">recompile</span> <span class="n">the</span> <span class="n">kernel</span> <span class="n">module</span> <span class="n">and</span> <span class="n">install</span> <span class="n">it</span> <span class="n">by</span> +</pre></div> + + +<h4 id="_18">解决方案:<a class="headerlink" href="#_18" title="Permanent link">&para;</a></h4> +<p>make sure: setup vboxdrv, and it is successful</p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">sudo</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">rc</span><span class="p">.</span><span class="n">d</span><span class="o">/</span><span class="n">vboxdrv</span> <span class="n">setup</span> +<span class="o">::</span> <span class="n">Unloading</span> <span class="n">VirtualBox</span> <span class="n">kernel</span> <span class="n">modules</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +<span class="o">::</span> <span class="n">Removing</span> <span class="n">old</span> <span class="n">VirtualBox</span> <span class="n">netadp</span> <span class="n">kernel</span> <span class="n">module</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +<span class="o">::</span> <span class="n">Removing</span> <span class="n">old</span> <span class="n">VirtualBox</span> <span class="n">netflt</span> <span class="n">kernel</span> <span class="n">module</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +<span class="o">::</span> <span class="n">Removing</span> <span class="n">old</span> <span class="n">VirtualBox</span> <span class="n">kernel</span> <span class="n">module</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +<span class="o">::</span> <span class="n">Recompiling</span> <span class="n">VirtualBox</span> <span class="n">kernel</span> <span class="n">modules</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +<span class="o">::</span> <span class="n">Reloading</span> <span class="n">VirtualBox</span> <span class="n">kernel</span> <span class="n">modules</span> <span class="p">[</span><span class="n">DONE</span><span class="p">]</span> +</pre></div> + + +<h5 id="if-the-warning-is-still-given-go-ahead-else-goodbye">If the warning is still given, go ahead! Else GoodBye!<a class="headerlink" href="#if-the-warning-is-still-given-go-ahead-else-goodbye" title="Permanent link">&para;</a></h5> +<p>you need to either manually load the module or add it in the MODULES array in rc.conf </p> +<p>to auto load the module at boot add <code>vboxdrv</code> to modules array in <code>/etc/rc.conf</code>,by the command: +<code>sudo modprobe vboxdrv</code></p>WonMon, 14 Apr 2014 00:00:00 +0800tag:wbowam.github.io,2014-04-14:edx_errors.htmlEdx在真机上部署Edx(在中国)http://wbowam.github.io/zai-zhen-ji-shang-bu-shu-edxzai-zhong-guo.html<h3 id="1-update-your-ubuntu-package-sources">1. Update your Ubuntu package sources<a class="headerlink" href="#1-update-your-ubuntu-package-sources" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">update</span> <span class="o">-</span><span class="n">y</span> +<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">upgrade</span> <span class="o">-</span><span class="n">y</span> +<span class="n">sudo</span> <span class="n">reboot</span> +</pre></div> + + +<h3 id="2sshuttle">2.用sshuttle翻墙<a class="headerlink" href="#2sshuttle" title="Permanent link">&para;</a></h3> +<p>(ubuntu下)首先安装它: <br /> +<code>sudo apt-get install sshuttle</code> <br /> +<code>sshuttle -r action@apne1.nitrousbox.com:22411 0.0.0.0/0 -vv</code> <br /> +搞定 , 就这么简单 注意action@apne1.nitrousbox.com:22411是我的ssh,你可以用你自己的,格式为username@sshserver, +我把sshserver理解为跳板机,在我的需求中,需要有一个国外的ssh账号,你有国外的vps的话就好办了,没有也没关系,感谢云平台的的兴起,我们只要注册(nitrous)[https://www.nitrous.io],就能有一个免费的ssh账号.</p> +<p>如果你使用(nitrous)[https://www.nitrous.io]记得每次使用时登录后把它打开.</p> +<h3 id="3one-step-installation">3.One step installation<a class="headerlink" href="#3one-step-installation" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">wget</span> <span class="n">https</span><span class="o">:</span><span class="c1">//raw.github.com/edx/configuration/master/util/install/vagrant.sh -O - | bash</span> +</pre></div> + + +<h3 id="4">4.防止出错<a class="headerlink" href="#4" title="Permanent link">&para;</a></h3> +<h6 id="nltk">上一步中,因为自动化脚本涉及到下载nltk包,由于我们翻墙了,网速可能会较慢,长时间下载(很有可能会出错),我们不想等待,如下操作。当然,如果你执意要等,不用做如下的操作<a class="headerlink" href="#nltk" title="Permanent link">&para;</a></h6> +<h4 id="nltk_1">手动下载nltk<a class="headerlink" href="#nltk_1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">cd</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">tmp</span> +<span class="n">wget</span> <span class="n">http</span><span class="o">:</span><span class="c1">//edx-static.s3.amazonaws.com/nltk/nltk-data-20131113.tar.gz</span> +<span class="n">chmod</span> <span class="n">o</span><span class="o">+</span><span class="n">rw</span> <span class="n">nltk</span><span class="o">-</span><span class="n">data</span><span class="o">-</span><span class="mf">20131113.</span><span class="n">tar</span><span class="p">.</span><span class="n">gz</span> +</pre></div> + + +<p>修改<code>/var/tmp/configuration/playbooks/edx-east/roles/ora/tasks/ease.yml</code> 中的<code>download and install nltk</code>任务内容为:</p> +<div class="highlight"><pre><span class="o">-</span> <span class="n">name</span><span class="o">:</span> <span class="n">download</span> <span class="n">and</span> <span class="n">install</span> <span class="n">nltk</span> + <span class="nl">shell:</span> <span class="o">|</span> + <span class="n">set</span> <span class="o">-</span><span class="n">e</span> + <span class="n">cp</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">nltk</span><span class="o">-</span><span class="n">data</span><span class="o">-</span><span class="mf">20131113.</span><span class="n">tar</span><span class="p">.</span><span class="n">gz</span> <span class="p">{{</span> <span class="n">ora_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">tar</span> <span class="n">zxf</span> <span class="p">{{</span> <span class="n">ora_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">rm</span> <span class="o">-</span><span class="n">f</span> <span class="p">{{</span> <span class="n">ora_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">touch</span> <span class="p">{{</span> <span class="n">ora_nltk_download_url</span><span class="o">|</span><span class="n">basename</span> <span class="p">}}</span><span class="o">-</span><span class="n">installed</span> + <span class="n">creates</span><span class="o">=</span><span class="p">{{</span> <span class="n">ora_data_dir</span> <span class="p">}}</span><span class="o">/</span><span class="p">{{</span> <span class="n">ora_nltk_download_url</span><span class="o">|</span><span class="n">basename</span> <span class="p">}}</span><span class="o">-</span><span class="n">installed</span> + <span class="n">chdir</span><span class="o">=</span><span class="p">{{</span> <span class="n">ora_data_dir</span> <span class="p">}}</span> + <span class="nl">sudo_user:</span> <span class="s">&quot;{{ common_web_user }}&quot;</span> + <span class="nl">notify:</span> + <span class="o">-</span> <span class="n">restart</span> <span class="n">ora</span> + <span class="o">-</span> <span class="n">restart</span> <span class="n">ora_celery</span> +</pre></div> + + +<p>修改<code>/var/tmp/configuration/playbooks/edx-east/roles/discern/tasks/deploy.yml</code> 中的<code>download and install nltk</code>任务内容为</p> +<div class="highlight"><pre><span class="o">-</span> <span class="n">name</span><span class="o">:</span> <span class="n">download</span> <span class="n">and</span> <span class="n">install</span> <span class="n">nltk</span> + <span class="nl">shell:</span> <span class="o">|</span> + <span class="n">set</span> <span class="o">-</span><span class="n">e</span> + <span class="n">cp</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">nltk</span><span class="o">-</span><span class="n">data</span><span class="o">-</span><span class="mf">20131113.</span><span class="n">tar</span><span class="p">.</span><span class="n">gz</span> <span class="p">{{</span> <span class="n">discern_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">tar</span> <span class="n">zxf</span> <span class="p">{{</span> <span class="n">discern_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">rm</span> <span class="o">-</span><span class="n">f</span> <span class="p">{{</span> <span class="n">discern_nltk_tmp_file</span> <span class="p">}}</span> + <span class="n">touch</span> <span class="p">{{</span> <span class="n">discern_nltk_download_url</span><span class="o">|</span><span class="n">basename</span> <span class="p">}}</span><span class="o">-</span><span class="n">installed</span> + <span class="n">creates</span><span class="o">=</span><span class="p">{{</span> <span class="n">discern_data_dir</span> <span class="p">}}</span><span class="o">/</span><span class="p">{{</span> <span class="n">discern_nltk_download_url</span><span class="o">|</span><span class="n">basename</span> <span class="p">}}</span><span class="o">-</span><span class="n">installed</span> + <span class="n">chdir</span><span class="o">=</span><span class="p">{{</span> <span class="n">discern_data_dir</span> <span class="p">}}</span> + <span class="nl">sudo_user:</span> <span class="s">&quot;{{ discern_user }}&quot;</span> + <span class="nl">notify:</span> + <span class="o">-</span> <span class="n">restart</span> <span class="n">discern</span> +</pre></div> + + +<h5 id="django143">手动安装<code>django==1.4.3</code><a class="headerlink" href="#django143" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">sudo</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">app</span><span class="o">/</span><span class="n">venvs</span><span class="o">/</span><span class="n">ora</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">pip</span> <span class="n">install</span> <span class="n">django</span><span class="o">==</span><span class="mf">1.4.3</span> +</pre></div> + + +<p>将<code>/edx/app/ora/ora/requirements.txt</code>里的<code>django==1.4.3</code>注释掉</p> +<hr /> +<h6 id="_1">安装的过程中,可能因为各种原因自动化脚本报错而停止,修复完问题后,可用如下命令从出错的位置开始执行<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h6> +<p><code>cd /var/tmp/configuration/playbooks &amp;&amp; sudo ansible-playbook -c local ./edx_sandbox.yml -i "localhost,"</code></p>WonTue, 08 Apr 2014 00:00:00 +0800tag:wbowam.github.io,2014-04-08:zai-zhen-ji-shang-bu-shu-edxzai-zhong-guo.htmlEdx翻墙之电脑篇http://wbowam.github.io/fan-qiang-zhi-dian-nao-pian.html<p>之前用过Goagent代理翻墙,很好用,再次感叹Google是个伟大的公司,,, +相比用Goagent,下面的成Chrome插件更加简便。</p> +<hr /> +<h3 id="1">1. <a href="https://chrome.google.com/webstore/search/%E7%BF%BB%E5%A2%99?hl=zh-CN">红杏</a><a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<p>到google应用商店,装上即可,不过非VIP只能翻有限的网站。。。。。</p> +<h3 id="2-sshuttle">2. sshuttle<a class="headerlink" href="#2-sshuttle" title="Permanent link">&para;</a></h3> +<p>闲逛github时看到基于 python 的 sshuttle</p> +<p>sshuttle被称为穷人的VPN.就是说它是免费的.</p> +<p>仅仅免费其实不够诱人,让我动心的是它的简单,而且可以在纯命令行下使用.</p> +<p>理论上vpn也是可以在纯命令行下使用的,我先后按照几个教程,都未成功.当然图形界面配置vpn很简单.</p> +<p>可问题是我必须在远程服务器上使用vpn(当然是用ssh登陆), 更新部署代码 , 需要连接国外服务器.</p> +<h5 id="_1">如何使用<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<p>(ubuntu下)首先安装它: +<code>sudo apt-get install sshuttle</code><br /> +<code>sshuttle -r action@apne1.nitrousbox.com:22411 0.0.0.0/0 -vv</code> </p> +<p>搞定 , 就这么简单 注意action@apne1.nitrousbox.com:22411是我的ssh,你可以用你自己的,格式为username@sshserver, +我把sshserver理解为跳板机,在我的需求中,需要有一个国外的ssh账号,你有国外的vps的话就好办了,没有也没关系,感谢云平台的的兴起,我们只要注册(nitrous)[https://www.nitrous.io],就能有一个免费的ssh账号.</p> +<p>如果你使用(nitrous)[https://www.nitrous.io]记得每次使用时登录后把它打开.</p>WonSat, 08 Mar 2014 00:00:00 +0800tag:wbowam.github.io,2014-03-08:fan-qiang-zhi-dian-nao-pian.html翻墙使用ngrok将内网端口映射到外网http://wbowam.github.io/shi-yong-ngrokjiang-nei-wang-duan-kou-ying-she-dao-wai-wang.html<h3 id="1">1.用法一:<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<p><code>./ngrok 80</code><br /> +这样会随机生成域名,若想定制域名看看方法二</p> +<h3 id="2">2.用法二:<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<h6 id="ngrokgithubauth-token7fsiqiigllgctzbucerv">登录ngrok官网,注册(可以直接用github帐号登录),获取<code>auth token</code>,如下面的<code>7FsiQIIGllGctZbUcERV</code>是我的,共享给大家使用<a class="headerlink" href="#ngrokgithubauth-token7fsiqiigllgctzbucerv" title="Permanent link">&para;</a></h6> +<h5 id="specify-your-auth-token">第一次使用时,本地用如下指令specify your auth token<a class="headerlink" href="#specify-your-auth-token" title="Permanent link">&para;</a></h5> +<p><code>ngrok -authtoken 7FsiQIIGllGctZbUcERV 80</code> <br /> +生成后可以取消</p> +<h5 id="80httptulparngrokcom">如下命令:映射80端口,使用二级域名:http://tulpar.ngrok.com<a class="headerlink" href="#80httptulparngrokcom" title="Permanent link">&para;</a></h5> +<p><code>./ngrok --subdomain tulpar 80</code></p>WonSat, 08 Mar 2014 00:00:00 +0800tag:wbowam.github.io,2014-03-08:shi-yong-ngrokjiang-nei-wang-duan-kou-ying-she-dao-wai-wang.htmlngrokXadmin入门http://wbowam.github.io/xadminru-men.html<p>之前用过一次Xadmin,很好。这一次又想用,竟然忘了怎么用,又得重头入门。之前写过印象笔记,如今翻来翻去,很杂,很乱,想当初真该写个博文的。这一次一定! </p> +<p>ENV:<br /> +python 2.7.3<br /> +Django 1.4.5<br /> +virtualenv 1.11.4 </p> +<hr /> +<h2 id="_1">.安装配置<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2> +<h4 id="1-install-xadmin">1. install xadmin<a class="headerlink" href="#1-install-xadmin" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">pip</span> <span class="n">install</span> <span class="n">django</span><span class="o">-</span><span class="n">xadmin</span> +</pre></div> + + +<h4 id="2">2.检查下列依赖包有没有都被安装<a class="headerlink" href="#2" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">django</span> <span class="o">&gt;=</span><span class="mf">1.4</span> +<span class="n">django</span><span class="o">-</span><span class="n">crispy</span><span class="o">-</span><span class="n">forms</span> <span class="o">&gt;=</span><span class="mf">1.2.3</span> <span class="p">(</span><span class="n">For</span> <span class="n">xadmin</span> <span class="n">crispy</span> <span class="n">forms</span><span class="p">)</span> +<span class="n">django</span><span class="o">-</span><span class="n">reversion</span> <span class="p">([</span><span class="n">OPTION</span><span class="p">]</span> <span class="n">For</span> <span class="n">object</span> <span class="n">history</span> <span class="n">and</span> <span class="n">reversion</span> <span class="n">feature</span><span class="p">,</span> <span class="n">please</span> <span class="n">select</span> <span class="n">right</span> <span class="n">version</span> <span class="n">by</span> <span class="n">your</span> <span class="n">django</span><span class="p">,</span> <span class="n">see</span> <span class="n">changelog</span> <span class="p">)</span> +<span class="n">xlwt</span> <span class="p">([</span><span class="n">OPTION</span><span class="p">]</span> <span class="n">For</span> <span class="n">export</span> <span class="n">xls</span> <span class="n">files</span><span class="p">)</span> +<span class="n">xlsxwriter</span> <span class="p">([</span><span class="n">OPTION</span><span class="p">]</span> <span class="n">For</span> <span class="n">export</span> <span class="n">xlsx</span> <span class="n">files</span><span class="p">)</span> +</pre></div> + + +<h4 id="3-xadmin-django">3. Xadmin 作为 Django 的模块,<a class="headerlink" href="#3-xadmin-django" title="Permanent link">&para;</a></h4> +<p>首先编辑 settings.py 添加 Xadmin 的模块到 INSTALLED_APPS 中 (注意, 安装 Django admin 所需要的 APP 也要安装, 但是 django.admin 可以不安装): </p> +<p>INSTALL_APPS</p> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> + +<span class="n">INSTALLED_APPS</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">contenttypes</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sessions</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">sites</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">messages</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">staticfiles</span><span class="err">&#39;</span><span class="p">,</span> + + <span class="err">#&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">admin</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="err">这个可以去掉</span> + +<span class="cp">##添加模块</span> + <span class="err">&#39;</span><span class="n">xadmin</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">crispy_forms</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">#</span> <span class="err">&#39;</span><span class="n">reversion</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">#</span> <span class="err">需要</span><span class="n">pip</span> <span class="n">install</span> <span class="n">django</span><span class="o">-</span><span class="n">reversion</span> + +<span class="p">)</span> +</pre></div> + + +<p>其中<code>xadmin</code>依赖<code>crispy_forms</code>默认安装,依赖<code>reversion</code>可选</p> +<h4 id="4-url-patterns-autodiscover">4. 然后添加 URL-patterns 以及 autodiscover 操作:<a class="headerlink" href="#4-url-patterns-autodiscover" title="Permanent link">&para;</a></h4> +<p>urls.py 添加</p> +<div class="highlight"><pre><span class="n">import</span> <span class="n">xadmin</span> +<span class="n">xadmin</span><span class="p">.</span><span class="n">autodiscover</span><span class="p">()</span> + +<span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="err">&#39;&#39;</span><span class="p">,</span> + <span class="n">url</span><span class="p">(</span><span class="n">r</span><span class="err">&#39;</span><span class="o">^</span><span class="err">$&#39;</span><span class="p">,</span> <span class="n">IndexView</span><span class="p">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">home</span><span class="err">&#39;</span><span class="p">),</span> + + <span class="n">url</span><span class="p">(</span><span class="n">r</span><span class="err">&#39;</span><span class="o">^</span><span class="n">xadmin</span><span class="o">/</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="n">xadmin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="n">urls</span><span class="p">),</span> <span class="n">name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">xadmin</span><span class="err">&#39;</span><span class="p">),</span> + + <span class="err">#</span><span class="p">...</span> +<span class="p">)</span> +</pre></div> + + +<p>当然得注释admin相关配置</p> +<h4 id="5-media">5. 收集 media 文件:<a class="headerlink" href="#5-media" title="Permanent link">&para;</a></h4> +<p><code>python manage.py collectstatic</code></p> +<h4 id="6appadminxpy">6.注册数据:app内写一个adminx.py<a class="headerlink" href="#6appadminxpy" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">import</span> <span class="n">xadmin</span> +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">New</span> + +<span class="n">xadmin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">New</span><span class="p">)</span> +</pre></div> + + +<h4 id="7">7. 配置后台界面,主题,图标什么的<a class="headerlink" href="#7" title="Permanent link">&para;</a></h4> +<hr /> +<p>效果图 <br /> +<img alt="test" src="http://tulparblog.qiniudn.com/xadmin1.png" /></p>WonWed, 05 Mar 2014 00:00:00 +0800tag:wbowam.github.io,2014-03-05:xadminru-men.htmlXadmin汉化edx-platformhttp://wbowam.github.io/yi-hua-edx-platform.html<h5 id="edx-paltform">搭建好edx-paltform 之后,需要定制:汉化,处理视频存储问题,定制前台。<a class="headerlink" href="#edx-paltform" title="Permanent link">&para;</a></h5> +<h5 id="fmyzjs">此文讲解汉化。谢谢<a href="http://d.edustack.org/t/edx-platform/40">fmyzjs</a>,<a href="http://www.idefs.comr/recordsedx-platform-internationalization-i18n.html">竹轩小站</a><a class="headerlink" href="#fmyzjs" title="Permanent link">&para;</a></h5> +<h3 id="1">1.准备<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<ul> +<li>基本的linux运维知识</li> +<li>部署成功的edx平台(如果没有可以去edustack.org下载我们的测试镜像)</li> +<li>transifex账号(OpenEdx翻译项目是在transifex.com上,有兴趣的同学可以参与进来)</li> +<li>耐心 +最后提醒,请不要使用root用户,必要时请使用sudo,如果您执意,GoodBye!</li> +</ul> +<hr /> +<h3 id="2transifex">2.安装transifex客户端<a class="headerlink" href="#2transifex" title="Permanent link">&para;</a></h3> +<p><code>sudo apt-get install transifex-client</code></p> +<h3 id="3transifex">3.在用户家目录新建transifex配置文件并编辑<a class="headerlink" href="#3transifex" title="Permanent link">&para;</a></h3> +<p><code>vi ~/.transifexrc</code></p> +<h5 id="_1">写入以下内容<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="k">[https://www.transifex.com]</span> +<span class="na">hostname</span> <span class="o">=</span> <span class="s">https://www.transifex.com</span> +<span class="na">username</span> <span class="o">=</span> <span class="s">user</span> +<span class="na">password</span> <span class="o">=</span> <span class="s">pass</span> +<span class="na">token</span> <span class="o">=</span> +</pre></div> + + +<h5 id="usernamepasswordtoken">其中请将username和password改成您自己的用户名和密码,token留空<a class="headerlink" href="#usernamepasswordtoken" title="Permanent link">&para;</a></h5> +<h3 id="4transifexrc">4.修改.transifexrc文件权限<a class="headerlink" href="#4transifexrc" title="Permanent link">&para;</a></h3> +<p><code>chmod o+rw ~/.transifexrc</code></p> +<h3 id="5edxapp">5.切换到edxapp用户并加载对应的环境变量<a class="headerlink" href="#5edxapp" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="o">-</span><span class="n">u</span> <span class="n">edxapp</span> <span class="n">bash</span> +<span class="n">source</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">app</span><span class="o">/</span><span class="n">edxapp</span><span class="o">/</span><span class="n">edxapp_env</span> +<span class="n">cd</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">app</span><span class="o">/</span><span class="n">edxapp</span><span class="o">/</span><span class="n">edx</span><span class="o">-</span><span class="n">platform</span> +</pre></div> + + +<h3 id="6msenvjson">6.修改*ms.env.json文件<a class="headerlink" href="#6msenvjson" title="Permanent link">&para;</a></h3> +<p><code>vim ../lms.env.json</code></p> +<h5 id="lmsenvjson">lms.env.json添加以下内容<a class="headerlink" href="#lmsenvjson" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="s">&quot;USE_I18N&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span> +<span class="s">&quot;LANGUAGE_CODE&quot;</span><span class="o">:</span> <span class="s">&quot;zh-cn&quot;</span> +</pre></div> + + +<p><code>vim ../cms.env.json</code></p> +<h5 id="cmsenvjson">cms.env.json添加以下内容<a class="headerlink" href="#cmsenvjson" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="s">&quot;USE_I18N&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span> +<span class="s">&quot;LANGUAGE_CODE&quot;</span><span class="o">:</span> <span class="s">&quot;zh-cn&quot;</span> +</pre></div> + + +<h3 id="7">7.执行翻译(请注意我说的是翻译,不是汉化,因为这不仅仅是汉化)<a class="headerlink" href="#7" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">tx</span> <span class="n">pull</span> <span class="o">-</span><span class="n">l</span> <span class="n">zh_CN</span> +<span class="n">python</span> <span class="p">.</span><span class="o">/</span><span class="n">i18n</span><span class="o">/</span><span class="n">generate</span><span class="p">.</span><span class="n">py</span> +</pre></div> + + +<h3 id="8assets">8.更新assets<a class="headerlink" href="#8assets" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">paver</span> <span class="n">update_assets</span> <span class="n">lms</span> <span class="o">--</span><span class="n">settings</span> <span class="n">aws</span> +<span class="n">paver</span> <span class="n">update_assets</span> <span class="n">cms</span> <span class="o">--</span><span class="n">settings</span> <span class="n">aws</span> +</pre></div> + + +<h3 id="9edxappedxapp">9.退出edxapp用户并重启edxapp<a class="headerlink" href="#9edxappedxapp" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">exit</span> +<span class="n">sudo</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">supervisorctl</span> <span class="o">-</span><span class="n">c</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">supervisord</span><span class="p">.</span><span class="n">conf</span> <span class="n">restart</span> <span class="n">edxapp</span><span class="o">:</span> +</pre></div>WonSun, 09 Feb 2014 00:00:00 +0800tag:wbowam.github.io,2014-02-09:yi-hua-edx-platform.htmlEdxLinux特别强大和灵活的命令行工具 (1)http://wbowam.github.io/linuxte-bie-qiang-da-he-ling-huo-de-ming-ling-xing-gong-ju-1.html<h4 id="_1">! ياخشى نەرسە سېسىپ قالمىسۇن<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<hr /> +<h3 id="curl">Curl<a class="headerlink" href="#curl" title="Permanent link">&para;</a></h3> +<p>Curl是一个网络传输工具,这是非常类似wget的,主要的区别在于,默认情况下,Wget的保存到一个文件,和curl的命令行输出。这使得它可以很简单,看一个网站的内容。这里举个例子,我们可以得到我们当前的IP从ifconfig.me网站:</p> +<div class="highlight"><pre><span class="n">curl</span> <span class="n">ifconfig</span><span class="p">.</span><span class="n">me</span> +<span class="mf">93.96.141.93</span> +</pre></div> + + +<p>Curl的-i(显示标题)和-I(只显示头)选项使其成为一个伟大的工具,调试HTTP响应,并找出到底什么是服务器发送到你的:</p> +<div class="highlight"><pre><span class="n">curl</span> <span class="o">-</span><span class="n">I</span> <span class="n">news</span><span class="p">.</span><span class="n">ycombinator</span><span class="p">.</span><span class="n">com</span> +<span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span> +<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="o">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">utf</span><span class="o">-</span><span class="mi">8</span> +<span class="n">Cache</span><span class="o">-</span><span class="n">Control</span><span class="o">:</span> <span class="n">private</span> +<span class="nl">Connection:</span> <span class="n">close</span> +</pre></div> + + +<p>-L选项是非常方便的,curl自动跟踪重定向。curl支持HTTP基本身份验证,cookies,手动设定标题等。</p> +<hr /> +<h3 id="netcat">netcat<a class="headerlink" href="#netcat" title="Permanent link">&para;</a></h3> +<p>netcat或nc被称为网络上的瑞士军刀。这是一个非常简单但也非常强大和灵活的应用程序,允许你创建任意的网络连接。在这里,我们看到它被用作一个端口扫描器:</p> +<div class="highlight"><pre><span class="n">nc</span> <span class="o">-</span><span class="n">z</span> <span class="n">example</span><span class="p">.</span><span class="n">com</span> <span class="mi">20</span><span class="o">-</span><span class="mi">100</span> +<span class="n">Connection</span> <span class="n">to</span> <span class="n">example</span><span class="p">.</span><span class="n">com</span> <span class="mi">22</span> <span class="n">port</span> <span class="p">[</span><span class="n">tcp</span><span class="o">/</span><span class="n">ssh</span><span class="p">]</span> <span class="n">succeeded</span><span class="o">!</span> +<span class="n">Connection</span> <span class="n">to</span> <span class="n">example</span><span class="p">.</span><span class="n">com</span> <span class="mi">80</span> <span class="n">port</span> <span class="p">[</span><span class="n">tcp</span><span class="o">/</span><span class="n">http</span><span class="p">]</span> <span class="n">succeeded</span><span class="o">!</span> +</pre></div> + + +<p>除了 建立任意的连接,netcat的还可以侦听传入的连接。在这里,我们使用nc的这一特点,结合tar命令,非常迅速地和有效地在服务器之间复制文件。 +在服务器上,运行以下命令:</p> +<div class="highlight"><pre><span class="n">nc</span> <span class="o">-</span><span class="n">l</span> <span class="mi">9090</span> <span class="o">|</span><span class="n">tar</span> <span class="o">-</span><span class="n">xzf</span> <span class="o">-</span> +</pre></div> + + +<p>在客户端:</p> +<div class="highlight"><pre><span class="n">tar</span> <span class="o">-</span><span class="n">czf</span> <span class="n">dir</span><span class="o">/|</span><span class="n">nc</span> <span class="n">service_ip</span> <span class="mi">9090</span> +</pre></div> + + +<p>我们可以使用netcat建立在网络上的任何应用程序。在这里,我们建立了一个8080端口的shell:</p> +<div class="highlight"><pre><span class="n">mkfifo</span> <span class="n">backpipe</span> +<span class="n">nc</span> <span class="o">-</span><span class="n">l</span> <span class="mi">8080</span> <span class="mi">0</span> <span class="o">&lt;</span><span class="n">backpipe</span> <span class="o">|</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">bash</span><span class="o">&gt;</span> <span class="n">backpipe</span> +</pre></div> + + +<p>现在,我们可以从任何客户端访问服务器:</p> +<div class="highlight"><pre><span class="n">nc</span> <span class="n">example</span><span class="p">.</span><span class="n">com</span> <span class="mi">8080</span> +<span class="n">uname</span><span class="o">-</span><span class="n">a</span> +<span class="n">Linux</span> <span class="n">li228</span><span class="o">-</span><span class="mi">162</span> <span class="mf">2.6.39.1</span><span class="o">-</span><span class="n">linode34</span> <span class="err">##</span><span class="mi">1</span> <span class="n">SMP</span> <span class="n">Tue</span> <span class="n">Jun</span> <span class="mi">21</span> <span class="mi">10</span><span class="o">:</span><span class="mi">29</span><span class="o">:</span><span class="mi">24</span> <span class="n">EDT</span> <span class="mi">2011</span> <span class="n">i686</span> <span class="n">GNU</span><span class="o">/</span><span class="n">Linux</span> +</pre></div> + + +<p>虽然最后的两个例子是有点做作的(在现实中,你会更容易使用的工具,如rsync复制文件和SSH远程访问服务器),也显示在所有的netcat的力量和灵活性,并暗示不同的事情,你可以通过与其他应用程序相结合的netcat的。</p> +<hr /> +<h3 id="sshuttle">sshuttle<a class="headerlink" href="#sshuttle" title="Permanent link">&para;</a></h3> +<hr /> +<h3 id="siege">Siege<a class="headerlink" href="#siege" title="Permanent link">&para;</a></h3> +<p>Siege是一个HTTP的基准测试工具。除了负载测试功能,它有一个方便的-g选项,这是非常类似于curl的-iL,显示你的请求报头。下面是一个例子(为简便起见,我删除了一些头文件):</p> +<div class="highlight"><pre><span class="n">siege</span> <span class="o">-</span><span class="n">g</span> <span class="n">www</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span> +<span class="n">GET</span> <span class="o">/</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> +<span class="nl">Host:</span> <span class="n">www</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span> +<span class="n">User</span><span class="o">-</span><span class="n">Agent</span><span class="o">:</span> <span class="n">JoeDog</span><span class="o">/</span><span class="mf">1.00</span> <span class="p">[</span><span class="n">en</span><span class="p">]</span> <span class="p">(</span><span class="n">X11</span><span class="p">;</span> <span class="n">I</span><span class="p">;</span> <span class="n">Siege</span> <span class="mf">2.70</span><span class="p">)</span> <span class="n">Connection</span><span class="o">:</span> <span class="n">close</span> + +<span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">302</span> <span class="n">Found</span> +<span class="nl">Location:</span> <span class="n">http</span><span class="o">:</span><span class="c1">//www.google.co.uk/</span> +<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="o">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span> +<span class="nl">Server:</span> <span class="n">gws</span> +<span class="n">Content</span><span class="o">-</span><span class="n">Length</span><span class="o">:</span> <span class="mi">221</span> +<span class="nl">Connection:</span> <span class="n">close</span> + +<span class="n">GET</span> <span class="o">/</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> +<span class="nl">Host:</span> <span class="n">www</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">co</span><span class="p">.</span><span class="n">uk</span> +<span class="n">User</span><span class="o">-</span><span class="n">Agent</span><span class="o">:</span> <span class="n">JoeDog</span><span class="o">/</span><span class="mf">1.00</span> <span class="p">[</span><span class="n">en</span><span class="p">]</span> <span class="p">(</span><span class="n">X11</span><span class="p">;</span> <span class="n">I</span><span class="p">;</span> <span class="n">Siege</span> <span class="mf">2.70</span><span class="p">)</span> +<span class="nl">Connection:</span> <span class="n">close</span> + +<span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span> +<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="o">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">ISO</span><span class="o">-</span><span class="mi">8859</span><span class="o">-</span><span class="mi">1</span> +<span class="n">X</span><span class="o">-</span><span class="n">XSS</span><span class="o">-</span><span class="n">Protection</span><span class="o">:</span> <span class="mi">1</span><span class="p">;</span> <span class="n">mode</span><span class="o">=</span><span class="n">block</span> +<span class="nl">Connection:</span> <span class="n">close</span> +</pre></div> + + +<p>Siege是真正伟大的是服务器负载测试。就像ab(Apache的HTTP服务器基准测试工具),你可以向一个网站发送的并发请求数,看看它是如何处理的交通。用下面的命令,我们将测试 +谷歌利用20个并发连接30秒,然后结束时得到一个很好的报告:</p> +<div class="highlight"><pre><span class="n">siege</span> <span class="o">-</span><span class="n">c20</span> <span class="n">www</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">co</span><span class="p">.</span><span class="n">uk</span> <span class="o">-</span><span class="n">b</span> <span class="o">-</span><span class="n">t30s</span> +<span class="err">…</span> +<span class="n">Lifting</span> <span class="n">the</span> <span class="n">server</span> <span class="n">siege</span><span class="err">…</span> <span class="n">done</span><span class="p">.</span> +<span class="nl">Transactions:</span> <span class="mi">1400</span> <span class="n">hits</span> +<span class="nl">Availability:</span> <span class="mf">100.00</span> <span class="o">%</span> +<span class="n">Elapsed</span> <span class="n">time</span><span class="o">:</span> <span class="mf">29.22</span> <span class="n">secs</span> +<span class="n">Data</span> <span class="n">transferred</span><span class="o">:</span> <span class="mf">13.32</span> <span class="n">MB</span> +<span class="n">Response</span> <span class="n">time</span><span class="o">:</span> <span class="mf">0.41</span> <span class="n">secs</span> +<span class="n">Transaction</span> <span class="n">rate</span><span class="o">:</span> <span class="mf">47.91</span> <span class="n">trans</span><span class="o">/</span><span class="n">sec</span> +<span class="nl">Throughput:</span> <span class="mf">0.46</span> <span class="n">MB</span><span class="o">/</span><span class="n">sec</span> +<span class="nl">Concurrency:</span> <span class="mf">19.53</span> +<span class="n">Successful</span> <span class="n">transactions</span><span class="o">:</span> <span class="mi">1400</span> +<span class="n">Failed</span> <span class="n">transactions</span><span class="o">:</span> <span class="mi">0</span> +<span class="n">Longest</span> <span class="n">transaction</span><span class="o">:</span> <span class="mf">4.08</span> +<span class="n">Shortest</span> <span class="n">transaction</span><span class="o">:</span> <span class="mf">0.08</span> +</pre></div> + + +<p>siege的最有用的功能之一是,它可以采取一个文件的URL作为输入,然后点击这些URL,而不仅仅是一个单一的页面。进行负载测试,这是伟大的,因为你可以重放实时交通对您的网站,看看它是如何执行的,而不是只打一遍又一遍相同的URL。在这里将教你如何使用siege在另一台服务器上实现Apache日志的重播:</p> +<div class="highlight"><pre><span class="n">cut</span> <span class="o">-</span><span class="n">d</span> <span class="err">‘</span> <span class="err">‘</span> <span class="o">-</span><span class="n">f7</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">log</span><span class="o">/</span><span class="n">apache2</span><span class="o">/</span><span class="n">access</span><span class="p">.</span><span class="n">log</span> <span class="o">&gt;</span> <span class="n">urls</span><span class="p">.</span><span class="n">txt</span> +<span class="n">siege</span> <span class="o">-</span><span class="n">c</span><span class="o">&lt;</span><span class="n">concurrency</span> <span class="n">rate</span><span class="o">&gt;</span> <span class="o">-</span><span class="n">b</span> <span class="o">-</span><span class="n">f</span> <span class="n">urls</span><span class="p">.</span><span class="n">txt</span> +</pre></div>WonSat, 08 Feb 2014 00:00:00 +0800tag:wbowam.github.io,2014-02-08:linuxte-bie-qiang-da-he-ling-huo-de-ming-ling-xing-gong-ju-1.htmlLinux使用Edx platformhttp://wbowam.github.io/shi-yong-edx-platform.html<h3 id="1-create-superuser">1. create superuser<a class="headerlink" href="#1-create-superuser" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="o">-</span><span class="n">u</span> <span class="n">www</span><span class="o">-</span><span class="n">data</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span> +<span class="n">bin</span><span class="o">/</span><span class="n">python</span><span class="p">.</span><span class="n">edxapp</span> <span class="p">.</span><span class="o">/</span><span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">lms</span> <span class="o">--</span><span class="n">settings</span> <span class="n">aws</span> <span class="n">create_user</span> <span class="o">-</span><span class="n">e</span> <span class="n">user</span><span class="err">@</span><span class="n">example</span><span class="p">.</span><span class="n">com</span> +<span class="n">sudo</span> <span class="o">-</span><span class="n">u</span> <span class="n">www</span><span class="o">-</span><span class="n">data</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">python</span><span class="p">.</span><span class="n">edxapp</span> <span class="p">.</span><span class="o">/</span><span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">lms</span> <span class="o">--</span><span class="n">settings</span> <span class="n">aws</span> <span class="n">changepassword</span> <span class="n">user</span> +<span class="n">sudo</span> <span class="o">-</span><span class="n">u</span> <span class="n">www</span><span class="o">-</span><span class="n">data</span> <span class="o">/</span><span class="n">edx</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">python</span><span class="p">.</span><span class="n">edxapp</span> <span class="p">.</span><span class="o">/</span><span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">lms</span> <span class="o">--</span><span class="n">settings</span> <span class="n">aws</span> <span class="n">shell</span> + +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">User</span> +<span class="n">me</span> <span class="o">=</span> <span class="n">User</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">username</span><span class="o">=</span><span class="s">&quot;user&quot;</span><span class="p">)</span> +<span class="n">me</span><span class="p">.</span><span class="n">is_superuser</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">me</span><span class="p">.</span><span class="n">is_staff</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">me</span><span class="p">.</span><span class="n">save</span><span class="p">()</span> +</pre></div> + + +<h3 id="2">2. 虚拟机配置网桥<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<h5 id="1-vagrantvagrantfile">(1) 配置vagrant(改Vagrantfile文件)<a class="headerlink" href="#1-vagrantvagrantfile" title="Permanent link">&para;</a></h5> +<p>回到项目起始目录,如我的是</p> +<div class="highlight"><pre><span class="n">pwd</span> +<span class="o">~/</span><span class="n">workplace</span><span class="o">/</span><span class="n">fullstack</span><span class="err">$</span> +<span class="n">ls</span> <span class="o">~/</span><span class="n">workplace</span><span class="o">/</span><span class="n">fullstack</span> +<span class="mi">20140418</span><span class="o">-</span><span class="n">injera</span><span class="o">-</span><span class="n">fullstack</span><span class="p">.</span><span class="n">box</span> <span class="n">Vagrantfile</span> +</pre></div> + + +<p>更改Networking方式,默认是host-only模式,如下:</p> +<div class="highlight"><pre><span class="n">config</span><span class="p">.</span><span class="n">vm</span><span class="p">.</span><span class="n">network</span> <span class="o">:</span><span class="n">private_network</span><span class="p">,</span> <span class="n">ip</span><span class="o">:</span> <span class="s">&quot;192.168.33.10&quot;</span> +</pre></div> + + +<p>改成:</p> +<div class="highlight"><pre><span class="n">config</span><span class="p">.</span><span class="n">vm</span><span class="p">.</span><span class="n">network</span> <span class="s">&quot;public_network&quot;</span><span class="p">,</span> <span class="o">:</span><span class="n">bridge</span> <span class="o">=&gt;</span> <span class="err">&#39;</span><span class="n">eth0</span><span class="err">&#39;</span> +</pre></div> + + +<p>添加IP和Port</p> +<div class="highlight"><pre><span class="n">config</span><span class="p">.</span><span class="n">ssh</span><span class="p">.</span><span class="n">host</span> <span class="o">=</span> <span class="s">&quot;202.206.221.119&quot;</span> +<span class="n">config</span><span class="p">.</span><span class="n">ssh</span><span class="p">.</span><span class="n">port</span> <span class="o">=</span> <span class="s">&quot;22&quot;</span> +</pre></div> + + +<p>以上<code>config.ssh.host</code> 和<code>config.ssh.port</code>默认127.0.0.1:2222和22</p> +<h5 id="2-networkingnatvirtualbox">(2) 更改虚拟机的Networking方式,默认是NAT模式,我用的是virtualbox<a class="headerlink" href="#2-networkingnatvirtualbox" title="Permanent link">&para;</a></h5> +<p><img alt="virtualbox" src="http://wwjpic.qiniudn.com/1.png" /></p> +<h5 id="3-ip">(3) 登录虚拟机,配置静态IP<a class="headerlink" href="#3-ip" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">vim</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">network</span><span class="o">/</span><span class="n">interfaces</span> +<span class="k">auto</span> <span class="n">eth0</span> +<span class="n">iface</span> <span class="n">eth0</span> <span class="n">inet</span> <span class="k">static</span> +<span class="n">address</span> <span class="mf">192.168.1.152</span> +<span class="n">gateway</span> <span class="mf">192.168.1.1</span> +<span class="n">netmask</span> <span class="mf">255.255.255.0</span> +<span class="n">network</span> <span class="mf">192.168.1.0</span> +<span class="n">broadcast</span> <span class="mf">192.168.1.255</span> +</pre></div> + + +<p>这样,IP并没有立即生效,重启网络服务</p> +<div class="highlight"><pre><span class="n">sudo</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">init</span><span class="p">.</span><span class="n">d</span><span class="o">/</span><span class="n">networking</span> <span class="n">restart</span> +</pre></div> + + +<h3 id="3edx">3.配置edx邮件服务<a class="headerlink" href="#3edx" title="Permanent link">&para;</a></h3> +<h5 id="cms">CMS<a class="headerlink" href="#cms" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">vim</span> <span class="o">/</span><span class="n">edx</span><span class="o">-</span><span class="n">platform</span><span class="o">/</span><span class="n">cms</span><span class="o">/</span><span class="n">envs</span><span class="o">/</span><span class="n">common</span><span class="p">.</span><span class="n">py</span> +</pre></div> + + +<p>配置#Email的内容,如下:</p> +<div class="highlight"><pre><span class="n">EMAIL_BACKEND</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">core</span><span class="p">.</span><span class="n">mail</span><span class="p">.</span><span class="n">backends</span><span class="p">.</span><span class="n">smtp</span><span class="p">.</span><span class="n">EmailBackend</span><span class="err">&#39;</span> +<span class="n">DEFAULT_FROM_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">mooc</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">DEFAULT_FEEDBACK_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">mooc</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">EMAIL_HOST</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">smtp</span><span class="p">.</span><span class="n">exmail</span><span class="p">.</span><span class="n">qq</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">EMAIL_HOST_USER</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">mooc</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">TECH_SUPPORT_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">root</span><span class="err">@</span><span class="n">idefs</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">CONTACT_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">mooc</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">SERVER_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">stack</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">BUGS_EMAIL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">stack</span><span class="err">@</span><span class="n">iflab</span><span class="p">.</span><span class="n">org</span><span class="err">&#39;</span> +<span class="n">EMAIL_HOST_PASSWORD</span> <span class="o">=</span> <span class="err">&#39;&#39;</span> +<span class="n">EMAIL_PORT</span> <span class="o">=</span> <span class="mi">465</span> +<span class="n">EMAIL_USE_TLS</span> <span class="o">=</span> <span class="err">&#39;</span><span class="nb">true</span><span class="err">&#39;</span> +<span class="n">ADMINS</span> <span class="o">=</span> <span class="p">(</span> +<span class="p">(</span><span class="err">&#39;</span><span class="n">edX</span> <span class="n">Admins</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">mooc</span><span class="err">&#39;</span><span class="p">),</span> +<span class="p">)</span> +</pre></div> + + +<h5 id="lms">Lms也是如此<a class="headerlink" href="#lms" title="Permanent link">&para;</a></h5> +<p>小编提示:配置好后,如果不正常,请检查所用邮箱,有可能会有以下问题:<br /> +1. 国外的邮件服务(如gmail),有可能被抢了<br /> +2. 你用的dns没法解析你所使用的smtp服务器(这种可能性很低,不过小编中了)。如我用的是smtp.qq.com,一直没法用,很不科学,找不到原因,最后抓包看了一下:原来我们学校dns服务器没能解析smtp.qq.com——蛋疼!</p>WonSat, 08 Feb 2014 00:00:00 +0800tag:wbowam.github.io,2014-02-08:shi-yong-edx-platform.htmlEdx命令行下使用VirtualBoxhttp://wbowam.github.io/ming-ling-xing-xia-shi-yong-virtualbox.html<p>有个小小的需求:ssh登录的远程服务器上,开启poweroff状态的VirtualBox虚拟机.......</p> +<p>需要学会在命令行下管理及使用VirtualBox, <br /> +下面只是一些基本的用法,只供入门。当然,如果你执意,也可以去看<a href="http://www.virtualbox.org/manual/ch08.html#idp6268864">VirtualBox文档</a></p> +<h3 id="_1">走起<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<hr /> +<h5 id="vboxmanage">一个命令可以满足我的需求,即VBoxManage<a class="headerlink" href="#vboxmanage" title="Permanent link">&para;</a></h5> +<h3 id="1-vboxmanage-startvm">1. VBoxManage startvm子命令可以开启一台状态为关闭或者保存的虚拟机。该命令的语法为:<a class="headerlink" href="#1-vboxmanage-startvm" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">VBoxManage</span> <span class="n">startvm</span> <span class="n">uuid</span><span class="o">&gt;|</span><span class="n">name</span><span class="p">...</span> <span class="p">[</span><span class="o">--</span><span class="n">type</span> <span class="n">gui</span><span class="o">|</span><span class="n">sdl</span><span class="o">|</span><span class="n">headless</span><span class="p">]</span> +</pre></div> + + +<h3 id="2-uuidnamelist">2. 可以通过虚拟机的uuid或者name来指定某台虚拟机,可以通过另外一个子命令list列出系统已有的虚拟机:<a class="headerlink" href="#2-uuidnamelist" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="err">$</span> <span class="n">VBoxManage</span> <span class="n">list</span> <span class="n">vms</span> +<span class="s">&quot;XP&quot;</span> <span class="p">{</span><span class="mi">8842</span><span class="n">d793</span><span class="o">-</span><span class="mi">228</span><span class="n">c</span><span class="o">-</span><span class="mi">458</span><span class="n">e</span><span class="o">-</span><span class="n">a880</span><span class="o">-</span><span class="mf">8051193f</span><span class="n">d2db</span><span class="p">}</span> +</pre></div> + + +<p>我系统上已经安装了一台名为XP的虚拟机,后面括号内部的是它的UUID。</p> +<h3 id="3vboxmanage-startvm-type">3.VBoxManage startvm子命令可以通过--type参数指定启动的方式<a class="headerlink" href="#3vboxmanage-startvm-type" title="Permanent link">&para;</a></h3> +<h4 id="gui">gui:图形化界面<a class="headerlink" href="#gui" title="Permanent link">&para;</a></h4> +<h4 id="sdl">sdl也是图形化界面,但是少掉了部分功能,比如没有菜单等,一般用于调试过程。<a class="headerlink" href="#sdl" title="Permanent link">&para;</a></h4> +<h4 id="headlessvrdp">headless:后台运行,并且默认开启vrdp服务,可以通过远程桌面工具来访问。<a class="headerlink" href="#headlessvrdp" title="Permanent link">&para;</a></h4> +<h5 id="_2">如:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h5> +<h6 id="gui_1">gui类型启动虚拟机:<a class="headerlink" href="#gui_1" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="err">$</span> <span class="n">VBoxManage</span> <span class="n">startvm</span> <span class="n">XP</span> <span class="o">--</span><span class="n">type</span> <span class="n">gui</span> +</pre></div> + + +<h6 id="headless">使用headless类型启动虚拟机:<a class="headerlink" href="#headless" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="err">$</span> <span class="n">VBoxManage</span> <span class="n">startvm</span> <span class="s">&quot;XP&quot;</span> <span class="o">--</span><span class="n">type</span> <span class="n">headless</span> +</pre></div> + + +<p>或者</p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">VBoxHeadless</span> <span class="o">--</span><span class="n">startvm</span> <span class="s">&quot;XP&quot;</span> +</pre></div>WonWed, 08 Jan 2014 00:00:00 +0800tag:wbowam.github.io,2014-01-08:ming-ling-xing-xia-shi-yong-virtualbox.htmlVirtualBoxUbuntu 用户用命令安装 VirtualBox 4.3.8http://wbowam.github.io/ubuntu-yong-hu-yong-ming-ling-an-zhuang-virtualbox-438.html<p>今天在阿里云上安装virtualbox,发现阿里的源里只有4.1版本,可我需要4.3。 <br /> +换了国内其他的源发现太慢了,,,,于是,,,,, <br /> +wget deb 包本地安装,发现依赖很多东西,,,,<br /> +于是,,,,,,</p> +<hr /> +<h3 id="1">1.添加源<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<p><code>vim /etc/apt/sources.list</code><br /> +添加: </p> +<div class="highlight"><pre><span class="k">deb</span> <span class="s">http://download.virtualbox.org/virtualbox/debian</span> <span class="kp">precise</span> <span class="kp">contrib</span> +</pre></div> + + +<h3 id="2">2.添加钥匙:(这一步很关键)<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">wget</span> <span class="o">-</span><span class="n">q</span> <span class="n">http</span><span class="o">:</span><span class="c1">//download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -</span> +</pre></div> + + +<h3 id="3">3.更新源列表:<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">update</span> +</pre></div> + + +<h3 id="4-virtualbox">4.安装 virtualbox<a class="headerlink" href="#4-virtualbox" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">virtualbox</span><span class="o">-</span><span class="mf">4.3</span> +</pre></div>WonWed, 08 Jan 2014 00:00:00 +0800tag:wbowam.github.io,2014-01-08:ubuntu-yong-hu-yong-ming-ling-an-zhuang-virtualbox-438.htmlVirtualBoxsshd_config配置http://wbowam.github.io/sshd_configpei-zhi.html<p>基本上,在您的系统中,『除非有必要,否则请不要更改 /etc/ssh/sshd_config 这个档案的设定值!』因为预设的情况下通常都是最严密的 SSH 保护了,因此,可以不需要更动他!上面的说明仅是在让大家了解每个细项的一些基本内容而已!需要注意的是最后一项,如果您不愿意开放 SFTP 的话,将最后一行批注掉即可! </p> +<hr /> +<div class="highlight"><pre><span class="cp">### 1. 关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式</span> +<span class="n">Port</span> <span class="mi">22</span><span class="err">          #</span> <span class="n">SSH</span> <span class="err">预设使用</span> <span class="mi">22</span> <span class="err">这个</span> <span class="n">port</span><span class="err">,您也可以使用多的</span> <span class="n">port</span> <span class="err">!</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">亦即重复使用</span> <span class="n">port</span> <span class="err">这个设定项目即可!</span> +<span class="n">Protocol</span> <span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="err">       </span> <span class="err">#</span> <span class="err">选择的</span> <span class="n">SSH</span> <span class="err">协议版本,可以是</span> <span class="mi">1</span> <span class="err">也可以是</span> <span class="mi">2</span> <span class="err">,</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">如果要同时支持两者,就必须要使用</span> <span class="mi">2</span><span class="p">,</span><span class="mi">1</span> <span class="err">这个分隔了!</span> +<span class="cp">#ListenAddress 0.0.0.0   # 监听的主机适配卡!举个例子来说,如果您有两个 IP,</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">分别是</span> <span class="mf">192.168.0.100</span> <span class="err">及</span> <span class="mf">192.168.2.20</span> <span class="err">,那么只想要</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">开放</span> <span class="mf">192.168.0.100</span> <span class="err">时,就可以写如同下面的样式:</span> +<span class="n">ListenAddress</span> <span class="mf">192.168.0.100</span> <span class="err">#</span> <span class="err">只监听来自</span> <span class="mf">192.168.0.100</span> <span class="err">这个</span> <span class="n">IP</span> <span class="err">的</span><span class="n">SSH</span><span class="err">联机。</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">如果不使用设定的话,则预设所有接口均接受</span> <span class="n">SSH</span> +<span class="n">PidFile</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">run</span><span class="o">/</span><span class="n">sshd</span><span class="p">.</span><span class="n">pid</span><span class="err">      #</span> <span class="err">可以放置</span> <span class="n">SSHD</span> <span class="err">这个</span> <span class="n">PID</span> <span class="err">的档案!左列为默认值</span> +<span class="n">LoginGraceTime</span> <span class="mi">600</span><span class="err">    </span> <span class="err">#</span> <span class="err">当使用者连上</span> <span class="n">SSH</span> <span class="n">server</span> <span class="err">之后,会出现输入密码的画面,</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">在该画面中,在多久时间内没有成功连上</span> <span class="n">SSH</span> <span class="n">server</span> <span class="err">,</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">就断线!时间为秒!</span> +<span class="n">Compression</span> <span class="n">yes</span><span class="err">      #</span> <span class="err">是否可以使用压缩指令?当然可以啰!</span> +<span class="err"> </span> +<span class="cp"># 2. 说明主机的 Private Key 放置的档案,预设使用下面的档案即可!</span> +<span class="n">HostKey</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">ssh</span><span class="o">/</span><span class="n">ssh_host_key</span><span class="err">    #</span> <span class="n">SSH</span> <span class="n">version</span> <span class="mi">1</span> <span class="err">使用的私钥</span> +<span class="n">HostKey</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">ssh</span><span class="o">/</span><span class="n">ssh_host_rsa_key</span><span class="err">  #</span> <span class="n">SSH</span> <span class="n">version</span> <span class="mi">2</span> <span class="err">使用的</span> <span class="n">RSA</span> <span class="err">私钥</span> +<span class="n">HostKey</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">ssh</span><span class="o">/</span><span class="n">ssh_host_dsa_key</span><span class="err">  #</span> <span class="n">SSH</span> <span class="n">version</span> <span class="mi">2</span> <span class="err">使用的</span> <span class="n">DSA</span> <span class="err">私钥</span> +<span class="cp"># 2.1 关于 version 1 的一些设定!</span> +<span class="n">KeyRegenerationInterval</span> <span class="mi">3600</span><span class="err"> </span> <span class="err">   #</span> <span class="err">由前面联机的说明可以知道,</span> <span class="n">version</span> <span class="mi">1</span> <span class="err">会使用</span> +<span class="err">                  </span> <span class="err">#</span> <span class="n">server</span> <span class="err">的</span> <span class="n">Public</span> <span class="n">Key</span> <span class="err">,那么如果这个</span> <span class="n">Public</span> +<span class="err">                  </span> <span class="err">#</span> <span class="n">Key</span> <span class="err">被偷的话,岂不完蛋?所以需要每隔一段时间</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">来重新建立一次!这里的时间为秒!</span> +<span class="n">ServerKeyBits</span> <span class="mi">768</span> <span class="err">         </span> <span class="err">#</span> <span class="err">没错!这个就是</span> <span class="n">Server</span> <span class="n">key</span> <span class="err">的长度!</span> +<span class="cp"># 3. 关于登录文件的讯息数据放置与 daemon 的名称!</span> +<span class="n">SyslogFacility</span> <span class="n">AUTH</span><span class="err">         #</span> <span class="err">当有人使用</span> <span class="n">SSH</span> <span class="err">登入系统的时候,</span><span class="n">SSH</span><span class="err">会记录资</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">讯,这个信息要记录在什么</span> <span class="n">daemon</span> <span class="n">name</span> <span class="err">底下?</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">预设是以</span> <span class="n">AUTH</span> <span class="err">来设定的,即是</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">log</span><span class="o">/</span><span class="n">secure</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">里面!什么?忘记了!回到</span> <span class="n">Linux</span> <span class="err">基础去翻一下</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">其它可用的</span> <span class="n">daemon</span> <span class="n">name</span> <span class="err">为:</span><span class="n">DAEMON</span><span class="p">,</span><span class="n">USER</span><span class="p">,</span><span class="n">AUTH</span><span class="p">,</span> +<span class="err">                  </span> <span class="err">#</span> <span class="n">LOCAL0</span><span class="p">,</span><span class="n">LOCAL1</span><span class="p">,</span><span class="n">LOCAL2</span><span class="p">,</span><span class="n">LOCAL3</span><span class="p">,</span><span class="n">LOCAL4</span><span class="p">,</span><span class="n">LOCAL5</span><span class="p">,</span> +<span class="n">LogLevel</span> <span class="n">INFO</span><span class="err">            #</span> <span class="err">登录记录的等级!嘿嘿!任何讯息!</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">同样的,忘记了就回去参考!</span> +<span class="cp"># 4. 安全设定项目!极重要!</span> +<span class="cp"># 4.1 登入设定部分</span> +<span class="n">PermitRootLogin</span> <span class="n">no</span><span class="err">  </span> <span class="err">  #</span> <span class="err">是否允许</span> <span class="n">root</span> <span class="err">登入!预设是允许的,但是建议设定成</span> <span class="n">no</span><span class="err">!</span> +<span class="n">UserLogin</span> <span class="n">no</span><span class="err">       </span> <span class="err">#</span> <span class="err">在</span> <span class="n">SSH</span> <span class="err">底下本来就不接受</span> <span class="n">login</span> <span class="err">这个程序的登入!</span> +<span class="n">StrictModes</span> <span class="n">yes</span><span class="err">      #</span> <span class="err">当使用者的</span> <span class="n">host</span> <span class="n">key</span> <span class="err">改变之后,</span><span class="n">Server</span> <span class="err">就不接受联机,</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">可以抵挡部分的木马程序!</span> +<span class="cp">#RSAAuthentication yes   # 是否使用纯的 RSA 认证!?仅针对 version 1 !</span> +<span class="n">PubkeyAuthentication</span> <span class="n">yes</span><span class="err"> </span> <span class="err">#</span> <span class="err">是否允许</span> <span class="n">Public</span> <span class="n">Key</span> <span class="err">?当然允许啦!只有</span> <span class="n">version</span> <span class="mi">2</span> +<span class="n">AuthorizedKeysFile</span> <span class="p">.</span><span class="n">ssh</span><span class="o">/</span><span class="n">authorized_keys</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">上面这个在设定若要使用不需要密码登入的账号时,那么那个</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">账号的存放档案所在档名!</span> +<span class="cp"># 4.2 认证部分</span> +<span class="n">RhostsAuthentication</span> <span class="n">no</span><span class="err">  #</span> <span class="err">本机系统不止使用</span> <span class="p">.</span><span class="n">rhosts</span> <span class="err">,因为仅使用</span> <span class="p">.</span><span class="n">rhosts</span> <span class="err">太</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">不安全了,所以这里一定要设定为</span> <span class="n">no</span> <span class="err">!</span> +<span class="n">IgnoreRhosts</span> <span class="n">yes</span><span class="err">     </span> <span class="err">#</span> <span class="err">是否取消使用</span> <span class="o">~/</span><span class="p">.</span><span class="n">ssh</span><span class="o">/</span><span class="p">.</span><span class="n">rhosts</span> <span class="err">来做为认证!当然是!</span> +<span class="n">RhostsRSAAuthentication</span> <span class="n">no</span> <span class="err">#</span> <span class="err">这个选项是专门给</span> <span class="n">version</span> <span class="mi">1</span> <span class="err">用的,使用</span> <span class="n">rhosts</span> <span class="err">档案在</span> +<span class="err">             </span> <span class="err">#</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">hosts</span><span class="p">.</span><span class="n">equiv</span><span class="err">配合</span> <span class="n">RSA</span> <span class="err">演算方式来进行认证!不要使用</span> +<span class="n">HostbasedAuthentication</span> <span class="n">no</span> <span class="err">#</span> <span class="err">这个项目与上面的项目类似,不过是给</span> <span class="n">version</span> <span class="mi">2</span> <span class="err">使用的!</span> +<span class="n">IgnoreUserKnownHosts</span> <span class="n">no</span><span class="err">  #</span> <span class="err">是否忽略家目录内的</span> <span class="o">~/</span><span class="p">.</span><span class="n">ssh</span><span class="o">/</span><span class="n">known_hosts</span> <span class="err">这个档案所记录</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">的主机内容?当然不要忽略,所以这里就是</span> <span class="n">no</span> <span class="err">啦!</span> +<span class="n">PasswordAuthentication</span> <span class="n">yes</span> <span class="err">#</span> <span class="err">密码验证当然是需要的!所以这里写</span> <span class="n">yes</span> <span class="err">啰!</span> +<span class="n">PermitEmptyPasswords</span> <span class="n">no</span><span class="err">  #</span> <span class="err">若上面那一项如果设定为</span> <span class="n">yes</span> <span class="err">的话,这一项就最好设定</span> +<span class="err">             </span> <span class="err">#</span> <span class="err">为</span> <span class="n">no</span> <span class="err">,这个项目在是否允许以空的密码登入!当然不许!</span> +<span class="n">ChallengeResponseAuthentication</span> <span class="n">yes</span> <span class="err">#</span> <span class="err">挑战任何的密码认证!所以,任何</span> <span class="n">login</span><span class="p">.</span><span class="n">conf</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">规定的认证方式,均可适用!</span> +<span class="cp">#PAMAuthenticationViaKbdInt yes # 是否启用其它的 PAM 模块!启用这个模块将会</span> +<span class="err">                  </span> <span class="err">#</span> <span class="err">导致</span> <span class="n">PasswordAuthentication</span> <span class="err">设定失效!</span> +<span class="err"> </span> +<span class="cp"># 4.3 与 Kerberos 有关的参数设定!因为我们没有 Kerberos 主机,所以底下不用设定!</span> +<span class="cp">#KerberosAuthentication no</span> +<span class="cp">#KerberosOrLocalPasswd yes</span> +<span class="cp">#KerberosTicketCleanup yes</span> +<span class="cp">#KerberosTgtPassing no</span> +<span class="err"> </span> +<span class="cp"># 4.4 底下是有关在 X-Window 底下使用的相关设定!</span> +<span class="n">X11Forwarding</span> <span class="n">yes</span> +<span class="cp">#X11DisplayOffset 10</span> +<span class="cp">#X11UseLocalhost yes</span> +<span class="cp"># 4.5 登入后的项目:</span> +<span class="n">PrintMotd</span> <span class="n">no</span> <span class="err">#</span> <span class="err">登入后是否显示出一些信息呢?例如上次登入的时间、地点等</span> +<span class="err">             #</span> <span class="err">等,预设是</span> <span class="n">yes</span> <span class="err">,但是,如果为了安全,可以考虑改为</span> <span class="n">no</span> <span class="err">!</span> +<span class="n">PrintLastLog</span> <span class="n">yes</span><span class="err">     #</span> <span class="err">显示上次登入的信息!可以啊!预设也是</span> <span class="n">yes</span> <span class="err">!</span> +<span class="n">KeepAlive</span> <span class="n">yes</span><span class="err">      </span> <span class="err">#</span> <span class="err">一般而言,如果设定这项目的话,那么</span> <span class="n">SSH</span> <span class="n">Server</span> <span class="err">会传送</span> +<span class="err">             #</span> <span class="n">KeepAlive</span> <span class="err">的讯息给</span> <span class="n">Client</span> <span class="err">端,以确保两者的联机正常!</span> +<span class="err">             #</span> <span class="err">在这个情况下,任何一端死掉后,</span> <span class="n">SSH</span> <span class="err">可以立刻知道!而不会</span> +<span class="err">             #</span> <span class="err">有僵尸程序的发生!</span> +<span class="n">UsePrivilegeSeparation</span> <span class="n">yes</span> <span class="err">#</span> <span class="err">使用者的权限设定项目!就设定为</span> <span class="n">yes</span> <span class="err">吧!</span> +<span class="n">MaxStartups</span> <span class="mi">10</span><span class="err">      #</span> <span class="err">同时允许几个尚未登入的联机画面?当我们连上</span> <span class="n">SSH</span> <span class="err">,</span> +<span class="err">             #</span> <span class="err">但是尚未输入密码时,这个时候就是我们所谓的联机画面啦!</span> +<span class="err">             #</span> <span class="err">在这个联机画面中,为了保护主机,所以需要设定最大值,</span> +<span class="err">             #</span> <span class="err">预设最多十个联机画面,而已经建立联机的不计算在这十个当中</span> +<span class="cp"># 4.6 关于使用者抵挡的设定项目:</span> +<span class="n">DenyUsers</span> <span class="o">*</span><span class="err">       </span> <span class="err">#</span> <span class="err">设定受抵挡的使用者名称,如果是全部的使用者,那就是全部</span> +<span class="err">             #</span> <span class="err">挡吧!若是部分使用者,可以将该账号填入!例如下列!</span> +<span class="n">DenyUsers</span> <span class="n">test</span> +<span class="n">DenyGroups</span> <span class="n">test</span><span class="err">     </span> <span class="err">#</span> <span class="err">与</span> <span class="n">DenyUsers</span> <span class="err">相同!仅抵挡几个群组而已!</span> +<span class="cp"># 5. 关于 SFTP 服务的设定项目!</span> +<span class="n">Subsystem</span> <span class="n">sftp</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">ssh</span><span class="o">/</span><span class="n">sftp</span><span class="o">-</span><span class="n">server</span> +</pre></div> + + +<p>另外,如果您修改过上面这个档案(/etc/ssh/sshd_config),那么就必需要重新启动一次 sshd 这个 daemon 才行!亦即是:<br /> +<code>/etc/rc.d/init.d/sshd restart</code></p>WonSun, 08 Dec 2013 00:00:00 +0800tag:wbowam.github.io,2013-12-08:sshd_configpei-zhi.htmlsshSSH原理http://wbowam.github.io/sshyuan-li.html<p>简单说,SSH是一种网络协议,用于计算机之间的加密登录。</p> +<hr /> +<h3 id="_1">一 最基本的用法<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。 +<code>$ ssh user@host</code> +如果本地用户名与远程用户名一致,登录时可以省略用户名。 +<code>$ ssh host</code> +SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。 +<code>$ ssh -p 2222 user@host</code> +上面这条命令表示,ssh直接连接远程主机的2222端口。</p> +<h3 id="ssh">二 SSH原理<a class="headerlink" href="#ssh" title="Permanent link">&para;</a></h3> +<p>SSH之所以能够保证安全,原因在于它采用了公钥加密。<br /> +原理如图<img alt="ssh原理图" src="http://tulparblog.qiniudn.com/ssh.jpg" /> +SSH登录整个过程是这样的:<br /> +(1)远程主机收到用户的登录请求,把自己的公钥发给用户。<br /> +(2)用户使用这个公钥,将登录密码加密后,发送回来。<br /> +(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。</p> +<h3 id="_2">三 密码登录过程<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p>如果你是第一次登录对方主机,系统会出现下面的提示: </p> +<div class="highlight"><pre><span class="err"> $</span> <span class="n">ssh</span> <span class="n">user</span><span class="err">@</span><span class="n">host</span> +<span class="err">  </span><span class="n">The</span> <span class="n">authenticity</span> <span class="n">of</span> <span class="n">host</span> <span class="err">&#39;</span><span class="n">host</span> <span class="p">(</span><span class="mf">12.18.429.21</span><span class="p">)</span><span class="err">&#39;</span> <span class="n">can</span><span class="err">&#39;</span><span class="n">t</span> <span class="n">be</span> <span class="n">established</span><span class="p">.</span> +<span class="err">  </span><span class="n">RSA</span> <span class="n">key</span> <span class="n">fingerprint</span> <span class="n">is</span> <span class="mi">98</span><span class="o">:</span><span class="mi">2</span><span class="n">e</span><span class="o">:</span><span class="n">d7</span><span class="o">:</span><span class="n">e0</span><span class="o">:</span><span class="n">de</span><span class="o">:</span><span class="mf">9f</span><span class="o">:</span><span class="n">ac</span><span class="o">:</span><span class="mi">67</span><span class="o">:</span><span class="mi">28</span><span class="o">:</span><span class="n">c2</span><span class="o">:</span><span class="mi">42</span><span class="o">:</span><span class="mi">2</span><span class="n">d</span><span class="o">:</span><span class="mi">37</span><span class="o">:</span><span class="mi">16</span><span class="o">:</span><span class="mi">58</span><span class="o">:</span><span class="mi">4</span><span class="n">d</span><span class="p">.</span> +<span class="err">  </span><span class="n">Are</span> <span class="n">you</span> <span class="n">sure</span> <span class="n">you</span> <span class="n">want</span> <span class="n">to</span> <span class="k">continue</span> <span class="n">connecting</span> <span class="p">(</span><span class="n">yes</span><span class="o">/</span><span class="n">no</span><span class="p">)</span><span class="o">?</span> +</pre></div> + + +<p>这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗? +所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。<br /> +上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。 +很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。 <br /> +假定经过风险衡量以后,用户决定接受这个远程主机的公钥。 <br /> +<code>Are you sure you want to continue connecting (yes/no)? yes</code> <br /> +系统会出现一句提示,表示host主机已经得到认可。 <br /> +<code>Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.</code> +然后,会要求输入密码。 <br /> +<code>Password: (enter password)</code> <br /> +如果密码正确,就可以登录了。<br /> +当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。<br /> +每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。</p> +<h3 id="_3">四 公钥登录<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<p>使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。<br /> +所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。 </p> +<p>这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:<br /> +<code>$ ssh-keygen</code> <br /> +运行上面的命令以后,系统会出现一系列提示,可以一路回车。也可以慢慢看英文,如果你执意。。。 </p> +<p>运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。 </p> +<p>这时再输入下面的命令,将公钥传送到远程主机host上面:<br /> +<code>$ ssh-copy-id user@host</code><br /> +好了,从此你再登录,就不需要输入密码了。 </p> +<h5 id="etcsshsshd_config">如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面"#"注释是否取掉。<a class="headerlink" href="#etcsshsshd_config" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">RSAAuthentication</span> <span class="n">yes</span> +<span class="err">  </span><span class="n">PubkeyAuthentication</span> <span class="n">yes</span> +<span class="err">  </span><span class="n">AuthorizedKeysFile</span> <span class="p">.</span><span class="n">ssh</span><span class="o">/</span><span class="n">authorized_keys</span> +</pre></div> + + +<p>然后,重启远程主机的ssh服务。 </p> +<div class="highlight"><pre><span class="err">  </span><span class="c1">// ubuntu系统</span> +<span class="err">  </span><span class="n">service</span> <span class="n">ssh</span> <span class="n">restart</span> +<span class="err">  </span><span class="c1">// debian系统</span> +<span class="err">  </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">init</span><span class="p">.</span><span class="n">d</span><span class="o">/</span><span class="n">ssh</span> <span class="n">restart</span> +</pre></div> + + +<hr /> +<h3 id="_4">五 绑定本地端口<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<p>既然SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性。 </p> +<p>假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就这样写:<br /> +<code>$ ssh -D 8080 user@host</code> </p> +<p>SSH会建立一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。可以想象,如果8080端口原来是一个不加密端口,现在将变成一个加密端口。 </p> +<h3 id="_5">本地端口转发<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3> +<p>有时,绑定本地端口还不够,还必须指定数据传送的目标主机,从而形成点对点的"端口转发"。为了区别后文的"远程端口转发",我们把这种情况称为"本地端口转发"(Local forwarding)。 </p> +<p>假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过host3,将host1连上host2。 </p> +<p>我们在host1执行下面的命令: </p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">ssh</span> <span class="o">-</span><span class="n">L</span> <span class="mi">2121</span><span class="o">:</span><span class="n">host2</span><span class="o">:</span><span class="mi">21</span> <span class="n">host3</span> +</pre></div> + + +<p>命令中的L参数一共接受三个值,分别是"本地端口:目标主机:目标主机端口",它们之间用冒号分隔。这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)。 </p> +<p>这样一来,我们只要连接host1的2121端口,就等于连上了host2的21端口。</p> +<div class="highlight"><pre><span class="err">$</span> <span class="n">ftp</span> <span class="n">localhost</span><span class="o">:</span><span class="mi">2121</span> +</pre></div> + + +<p>"本地端口转发"使得host1和host3之间仿佛形成一个数据传输的秘密隧道,因此又被称为"SSH隧道"。 </p> +<h3 id="_6">六 远程端口转发<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3> +<p>既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发。 </p> +<p>还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,"本地端口转发"就不能用了,怎么办? </p> +<p>解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。 </p> +<p>我们在host3执行下面的命令:<br /> +<code>$ ssh -R 2121:host2:21 host1</code> <br /> +R参数也是接受三个值,分别是"远程主机端口:目标主机:目标主机端口"。这条命令的意思,就是让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为"远程端口绑定"。 </p> +<p>绑定之后,我们在host1就可以连接host2了: <br /> +<code>$ ftp localhost:2121</code> <br /> +这里必须指出,"远程端口转发"的前提条件是,host1和host3两台主机都有sshD和ssh客户端。</p>WonSun, 08 Dec 2013 00:00:00 +0800tag:wbowam.github.io,2013-12-08:sshyuan-li.htmlsshTmux 入门http://wbowam.github.io/tmux-ru-men.html<h3 id="tmux">tmux快捷键<a class="headerlink" href="#tmux" title="Permanent link">&para;</a></h3> +<p>tmux在会话中使用大量的快捷键来控制多个窗口、多个会话等。</p> +<div class="highlight"><pre><span class="n">Ctrl</span><span class="o">+</span><span class="n">b</span> <span class="c1">// 激活控制台;此时以下按键生效 </span> +<span class="err">系统操作</span> + <span class="o">?</span> <span class="c1">// 列出所有快捷键;按q返回 </span> + <span class="n">d</span> <span class="c1">// 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 </span> + <span class="n">D</span> <span class="c1">// 选择要脱离的会话;在同时开启了多个会话时使用 </span> + <span class="n">Ctrl</span><span class="o">+</span><span class="n">z</span> <span class="c1">// 挂起当前会话 </span> + <span class="n">r</span> <span class="c1">// 强制重绘未脱离的会话 </span> + <span class="n">s</span> <span class="c1">// 选择并切换会话;在同时开启了多个会话时使用 </span> + <span class="o">:</span> <span class="c1">// 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器 </span> + <span class="p">[</span> <span class="c1">// 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出 </span> + <span class="o">~</span> <span class="c1">// 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息 </span> +<span class="err">窗口操作</span> + <span class="n">c</span> <span class="c1">// 创建新窗口 </span> + <span class="o">&amp;</span> <span class="c1">// 关闭当前窗口 </span> + <span class="err">数字键</span> <span class="c1">// 切换至指定窗口 </span> + <span class="n">p</span> <span class="c1">// 切换至上一窗口 </span> + <span class="n">n</span> <span class="c1">// 切换至下一窗口 </span> + <span class="n">l</span> <span class="c1">// 在前后两个窗口间互相切换 </span> + <span class="n">w</span> <span class="c1">// 通过窗口列表切换窗口 </span> + <span class="p">,</span> <span class="c1">// 重命名当前窗口;这样便于识别 </span> + <span class="p">.</span> <span class="c1">// 修改当前窗口编号;相当于窗口重新排序 </span> + <span class="n">f</span> <span class="c1">// 在所有窗口中查找指定文本 </span> +<span class="err">面板操作</span> + <span class="err">”</span> <span class="c1">// 将当前面板平分为上下两块 </span> + <span class="o">%</span> <span class="c1">// 将当前面板平分为左右两块 </span> + <span class="n">x</span> <span class="c1">// 关闭当前面板 </span> + <span class="o">!</span> <span class="c1">// 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板 </span> + <span class="n">Ctrl</span><span class="o">+</span><span class="err">方向键</span> <span class="c1">// 以1个单元格为单位移动边缘以调整当前面板大小 </span> + <span class="n">Alt</span><span class="o">+</span><span class="err">方向键</span> <span class="c1">// 以5个单元格为单位移动边缘以调整当前面板大小 </span> + <span class="n">Space</span> <span class="c1">// 在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled </span> + <span class="n">q</span> <span class="c1">// 显示面板编号 </span> + <span class="n">o</span> <span class="c1">// 在当前窗口中选择下一面板 </span> + <span class="err">方向键</span> <span class="c1">// 移动光标以选择面板 </span> + <span class="p">{</span> <span class="c1">// 向前置换当前面板 </span> + <span class="p">}</span> <span class="c1">// 向后置换当前面板 </span> + <span class="n">Alt</span><span class="o">+</span><span class="n">o</span> <span class="c1">// 逆时针旋转当前窗口的面板 </span> + <span class="n">Ctrl</span><span class="o">+</span><span class="n">o</span> <span class="c1">// 顺时针旋转当前窗口的面板 </span> +</pre></div> + + +<h3 id="_1">主要快捷键<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>-- 基本使用</p> +<div class="highlight"><pre><span class="n">tmux</span> <span class="c1">//运行C-b d //返回主 shell , tmux 依旧在后台运行,里面的命令也保持运行状态tmux attach //恢复tmux</span> +<span class="o">--</span> <span class="err">快捷键</span> +<span class="n">tmux</span> <span class="err">的使用主要就是依靠快捷键,通过</span> <span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="err">来调用。</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="o">?</span> <span class="c1">// 显示快捷键帮助</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">C</span><span class="o">-</span><span class="n">o</span> <span class="c1">//调换窗口位置</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="err">空格键</span> <span class="c1">//采用下一个内置布局</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="o">!</span> <span class="c1">// 把当前窗口变为新窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="s">&quot; // 模向分隔窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="o">%</span> <span class="c1">// 纵向分隔窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">q</span> <span class="c1">// 显示分隔窗口的编号</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">o</span> <span class="c1">// 跳到下一个分隔窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="err">上下键</span> <span class="c1">// 上一个及下一个分隔窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">C</span><span class="o">-</span><span class="err">方向键</span> <span class="c1">//调整分隔窗口大小</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="o">&amp;</span> <span class="c1">// 确认后退出 tmux</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">c</span> <span class="c1">// 创建新窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="err">,</span><span class="c1">//修改当前窗口名称</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="mi">0</span><span class="o">~</span><span class="mi">9</span> <span class="c1">//选择几号窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">c</span> <span class="c1">// 创建新窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">n</span> <span class="c1">// 选择下一个窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">l</span> <span class="c1">// 最后使用的窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">p</span> <span class="c1">// 选择前一个窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">w</span> <span class="c1">// 以菜单方式显示及选择窗口</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">s</span> <span class="c1">// 以菜单方式显示和选择会话</span> +<span class="n">C</span><span class="o">-</span><span class="n">b</span> <span class="n">t</span> <span class="c1">//显示时钟</span> +</pre></div> + + +<h3 id="_2">配置文件<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p>tmux配置文件在~/.tmux.conf和/etc/tmux.conf中,配置文件中可以修改默认绑定的快捷键</p> +<p>配置文件示例:</p> +<div class="highlight"><pre><span class="c1">// 此类配置可以在命令行模式中输入show-options -g查询 </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">base</span><span class="o">-</span><span class="n">index</span> <span class="mh">1</span> <span class="c1">// 窗口的初始序号;默认为0,这里设置为1 </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">display</span><span class="o">-</span><span class="k">time</span> <span class="mh">5000</span> <span class="c1">// 提示信息的持续时间;设置足够的时间以避免看不清提示,单位为毫秒 </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="k">repeat</span><span class="o">-</span><span class="k">time</span> <span class="mh">1000</span> <span class="c1">// 控制台激活后的持续时间;设置合适的时间以避免每次操作都要先激活控制台,单位为毫秒 </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">status</span><span class="o">-</span><span class="n">keys</span> <span class="n">vi</span> <span class="c1">// 操作状态栏时的默认键盘布局;可以设置为vi或emacs </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">status</span><span class="o">-</span><span class="n">right</span> <span class="s">&quot;#(date +%H:%M&#39; &#39;)&quot;</span> <span class="c1">// 状态栏右方的内容;这里的设置将得到类似23:59的显示 </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">status</span><span class="o">-</span><span class="n">right</span><span class="o">-</span><span class="n">length</span> <span class="mh">10</span> <span class="c1">// 状态栏右方的内容长度;建议把更多的空间留给状态栏左方(用于列出当前窗口) </span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">status</span><span class="o">-</span><span class="n">utf8</span> <span class="n">on</span> <span class="c1">// 开启状态栏的UTF-8支持 </span> + +<span class="c1">// 此类设置可以在命令行模式中输入show-window-options -g查询 </span> +<span class="n">set</span><span class="o">-</span><span class="n">window</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">mode</span><span class="o">-</span><span class="n">keys</span> <span class="n">vi</span> <span class="c1">// 复制模式中的默认键盘布局;可以设置为vi或emacs </span> +<span class="n">set</span><span class="o">-</span><span class="n">window</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">utf8</span> <span class="n">on</span> <span class="c1">// 开启窗口的UTF-8支持 </span> + +<span class="c1">// 将激活控制台的快捷键由Ctrl+b修改为Ctrl+a,Ctrl+a是Screen的快捷键</span> +<span class="n">set</span><span class="o">-</span><span class="n">option</span> <span class="o">-</span><span class="n">g</span> <span class="n">prefix</span> <span class="no">C</span><span class="o">-</span><span class="n">a</span> +<span class="n">unbind</span><span class="o">-</span><span class="n">key</span> <span class="no">C</span><span class="o">-</span><span class="n">b</span> +<span class="k">bind</span><span class="o">-</span><span class="n">key</span> <span class="no">C</span><span class="o">-</span><span class="n">a</span> <span class="n">send</span><span class="o">-</span><span class="n">prefix</span> + +<span class="c1">// 添加自定义快捷键 </span> +<span class="k">bind</span><span class="o">-</span><span class="n">key</span> <span class="n">z</span> <span class="n">kill</span><span class="o">-</span><span class="n">session</span> <span class="c1">// 按z结束当前会话;相当于进入命令行模式后输入kill-session </span> +<span class="k">bind</span><span class="o">-</span><span class="n">key</span> <span class="n">h</span> <span class="n">select</span><span class="o">-</span><span class="n">layout</span> <span class="n">even</span><span class="o">-</span><span class="n">horizontal</span> <span class="c1">// 按h将当前面板布局切换为even-horizontal;相当于进入命令行模式后输入select-layout even-horizontal </span> +<span class="k">bind</span><span class="o">-</span><span class="n">key</span> <span class="n">v</span> <span class="n">select</span><span class="o">-</span><span class="n">layout</span> <span class="n">even</span><span class="o">-</span><span class="n">vertical</span> <span class="c1">// 按v将当前面板布局切换为even-vertical;相当于进入命令行模式后输入select-layout even-vertical </span> +</pre></div>WonSun, 08 Dec 2013 00:00:00 +0800tag:wbowam.github.io,2013-12-08:tmux-ru-men.htmlTmuxGithub上搭博客http://wbowam.github.io/githubshang-da-bo-ke.html<p>Github上搭博客</p> +<hr /> +<h3 id="1">1.过程概要<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<ul> +<li>在Github上创建工程</li> +<li>安装配置pelican和git,以及准备工作</li> +<li>开始写博客</li> +</ul> +<h3 id="2">2.详细步骤<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3> +<h3 id="github">在GitHub上创建工程<a class="headerlink" href="#github" title="Permanent link">&para;</a></h3> +<p>注册,配置github的过程略过</p> +<h5 id="tulpar008githubcomtulpar008">创建一个tulpar008.github.com的库(tulpar008是用户名必须是用户名)<a class="headerlink" href="#tulpar008githubcomtulpar008" title="Permanent link">&para;</a></h5> +<h5 id="pelican">安装配置pelican,以及准备工作<a class="headerlink" href="#pelican" title="Permanent link">&para;</a></h5> +<h4 id="pelican_1">pelican的安装<a class="headerlink" href="#pelican_1" title="Permanent link">&para;</a></h4> +<p><code>sudo pip install pelican</code> </p> +<h4 id="blogblog">电脑上创建一个blog目录,用来存放你的博客文件(我这里目录名直接用的“blog”)<a class="headerlink" href="#blogblog" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">mkdir</span> <span class="n">blog</span> +<span class="n">cd</span> <span class="n">blog</span> +<span class="n">pelican</span><span class="o">-</span><span class="n">quickstart</span> +</pre></div> + + +<p>这个时候你会看到blog目录下多了几个Pelican生成的文件,其中的pelicanconf.py就是配置文件</p> +<h3 id="_1">开始写博客<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p>现在,就可以用Pelican开始写博客了,具体怎么写可参看Pelican的文档,这里我用Markdown举例。</p> +<h4 id="contentmd">进入content目录,用编辑器创建一个文件,写入博客内容并保存为md文件:<a class="headerlink" href="#contentmd" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">Date</span><span class="o">:</span> <span class="mi">2013</span><span class="o">-</span><span class="mi">06</span><span class="o">-</span><span class="mi">06</span> <span class="err">#日期</span> +<span class="n">Title</span><span class="o">:</span> <span class="n">My</span> <span class="n">Super</span> <span class="n">Beginng</span> <span class="err">#标题</span> +<span class="n">Tags</span><span class="o">:</span> <span class="n">Writing</span><span class="o">,</span> <span class="n">Life</span> <span class="err">#标签</span> +<span class="n">Category</span><span class="o">:</span> <span class="n">Life</span> <span class="err">#分类</span> +<span class="err">文章内容</span> +</pre></div> + + +<h4 id="blogmdhtml">写好之后,回到blog目录,将md文件翻译成html静态页面:<a class="headerlink" href="#blogmdhtml" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">cd</span> <span class="p">..</span> +<span class="n">make</span> <span class="n">html</span> +</pre></div> + + +<h6 id="_2">你还可以用这条命令编译:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h6> +<p><code>pelican content</code></p> +<h4 id="contentgithub">进入content目录,内容上传至github<a class="headerlink" href="#contentgithub" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">cd</span> <span class="n">content</span> + +<span class="n">git</span> <span class="n">init</span> +<span class="n">git</span> <span class="n">add</span> <span class="p">.</span> +<span class="n">git</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s">&quot;first commit&quot;</span> +<span class="n">git</span> <span class="n">remote</span> <span class="n">add</span> <span class="n">origin</span> <span class="n">git</span><span class="err">@</span><span class="n">github</span><span class="p">.</span><span class="n">com</span><span class="o">:</span><span class="n">tulpar008</span><span class="o">/</span><span class="n">tulpar008</span><span class="p">.</span><span class="n">github</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="n">git</span> +<span class="n">git</span> <span class="n">push</span> <span class="o">-</span><span class="n">u</span> <span class="n">origin</span> <span class="n">master</span> +</pre></div> + + +<hr /> +<p>That's all 去访问你的博客吧,<a href="http://tulpar008.github.com">我的</a></p> +<hr /> +<h2 id="_3">后续:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h2> +<h3 id="_4">更换主题<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<h4 id="githubpelicanclone">把github上pelican的主题全都clone下来<a class="headerlink" href="#githubpelicanclone" title="Permanent link">&para;</a></h4> +<p><code>git clone git://github.com/getpelican/pelican-themes.git</code> <br /> +在里面找到一个你喜欢的主题,假如这个主题的目录是 ~/pelican-themes/bootstrap2 ,</p> +<h4 id="pelican-themes">使用pelican-themes安装这个主题<a class="headerlink" href="#pelican-themes" title="Permanent link">&para;</a></h4> +<p><code>sudo pelican-themes -i ~/pelican-themes/bootstrap2</code> </p> +<h6 id="pelican-themes_1">随后就可以用pelican-themes查看已安装的主题<a class="headerlink" href="#pelican-themes_1" title="Permanent link">&para;</a></h6> +<p><code>pelican-themes --list --verbose</code> </p> +<h4 id="pelicanconfpytheme">要在你的博客中使用安装好的主题,直接在pelicanconf.py文件中修改或者添加THEME项为想要的主题名,例如<a class="headerlink" href="#pelicanconfpytheme" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">THEME</span> <span class="o">=</span> <span class="s">&quot;bootstrap2&quot;</span> +</pre></div> + + +<h4 id="_5">然后执行<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4> +<p><code>make html</code></p>WonFri, 08 Nov 2013 00:00:00 +0800tag:wbowam.github.io,2013-11-08:githubshang-da-bo-ke.html博客linux 小技巧(1)http://wbowam.github.io/linux-xiao-ji-qiao-1.html<h3 id="1install-local-deb-packages">1.install local deb packages:<a class="headerlink" href="#1install-local-deb-packages" title="Permanent link">&para;</a></h3> +<p><code>dpkg -i file.deb</code></p> +<h5 id="uninstall-packages-installed-with-dpkg">uninstall packages installed with dpkg:<a class="headerlink" href="#uninstall-packages-installed-with-dpkg" title="Permanent link">&para;</a></h5> +<p><code>``dpkg -r appname</code></p> +<h5 id="list-packages-installed-with-dpkg">list packages installed with dpkg:<a class="headerlink" href="#list-packages-installed-with-dpkg" title="Permanent link">&para;</a></h5> +<p><code>dpkg --get-selections | grep -v deinstall</code></p>WonFri, 08 Nov 2013 00:00:00 +0800tag:wbowam.github.io,2013-11-08:linux-xiao-ji-qiao-1.htmllinuxShell脚本编程30分钟入门http://wbowam.github.io/shelljiao-ben-bian-cheng-30fen-zhong-ru-men.html<p>====================</p> +<h3 id="shell">什么是Shell脚本<a class="headerlink" href="#shell" title="Permanent link">&para;</a></h3> +<h4 id="_1">示例<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<p>看个例子吧:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4 +5 +6 +7 +8</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/sh</span> +<span class="nb">cd</span> ~ +mkdir shell_tut +<span class="nb">cd </span>shell_tut + +<span class="k">for</span> <span class="o">((</span><span class="nv">i</span><span class="o">=</span>0; i&lt;10; i++<span class="o">))</span>; <span class="k">do</span> +<span class="k"> </span>touch test_<span class="nv">$i</span>.txt +<span class="k">done</span> +</pre></div> +</td></tr></table> + +<h4 id="_2">示例解释<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<ul> +<li>第1行:指定脚本解释器,这里是用/bin/sh做解释器的</li> +<li>第2行:切换到当前用户的home目录</li> +<li>第3行:创建一个目录shell_tut</li> +<li>第4行:切换到shell_tut目录</li> +<li>第5行:循环条件,一共循环10次</li> +<li>第6行:创建一个test_1…10.txt文件</li> +<li>第7行:循环体结束</li> +</ul> +<p>cd, mkdir, touch都是系统自带的程序,一般在/bin或者/usr/bin目录下。for, do, done是sh脚本语言的关键字。</p> +<h4 id="shellshell">shell和shell脚本的概念<a class="headerlink" href="#shellshell" title="Permanent link">&para;</a></h4> +<p>shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。</p> +<p>shell脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。由于习惯的原因,简洁起见,本文出现的“shell编程”都是指shell脚本编程,不是指开发shell自身(如Windows Explorer扩展开发)。</p> +<h3 id="_3">环境<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3> +<p>shell编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。</p> +<h4 id="os">OS<a class="headerlink" href="#os" title="Permanent link">&para;</a></h4> +<p>当前主流的操作系统都支持shell编程,本文档所述的shell编程是指Linux下的shell,讲的基本都是POSIX标准下的功能,所以,也适用于Unix及BSD(如Mac OS)。</p> +<h4 id="linux">Linux<a class="headerlink" href="#linux" title="Permanent link">&para;</a></h4> +<p>Linux默认安装就带了shell解释器。</p> +<h4 id="mac-os">Mac OS<a class="headerlink" href="#mac-os" title="Permanent link">&para;</a></h4> +<p>Mac OS不仅带了sh、bash这两个最基础的解释器,还内置了ksh、csh、zsh等不常用的解释器。</p> +<h4 id="windows">Windows上的模拟器<a class="headerlink" href="#windows" title="Permanent link">&para;</a></h4> +<p>windows出厂时没有内置shell解释器,需要自行安装,为了同时能用grep, awk, curl等工具,最好装一个cygwin或者mingw来模拟linux环境。</p> +<ul> +<li><a href="www.cygwin.com">cygwin</a></li> +<li><a href="www.mingw.org">mingw</a></li> +</ul> +<h3 id="_4">脚本解释器<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3> +<h4 id="sh">sh<a class="headerlink" href="#sh" title="Permanent link">&para;</a></h4> +<p>即Bourne shell,POSIX(Portable Operating System Interface)标准的shell解释器,它的二进制文件路径通常是/bin/sh,由Bell Labs开发。</p> +<p>本文讲的是sh,如果你使用其它语言用作shell编程,请自行参考相应语言的文档。</p> +<h4 id="bash">bash<a class="headerlink" href="#bash" title="Permanent link">&para;</a></h4> +<p>Bash是Bourne shell的替代品,属GNU Project,二进制文件路径通常是/bin/bash。业界通常混用bash、sh、和shell,比如你会经常在招聘运维工程师的文案中见到:熟悉Linux Bash编程,精通Shell编程。</p> +<p>在CentOS里,/bin/sh是一个指向/bin/bash的符号链接:</p> +<div class="highlight"><pre><span class="p">[</span><span class="n">root</span><span class="err">@</span><span class="n">centosraw</span> <span class="o">~</span><span class="p">]</span><span class="err">#</span> <span class="n">ls</span> <span class="o">-</span><span class="n">l</span> <span class="o">/</span><span class="n">bin</span><span class="o">/*</span><span class="n">sh</span> +<span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="p">.</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">root</span> <span class="mi">903272</span> <span class="n">Feb</span> <span class="mi">22</span> <span class="mo">05</span><span class="o">:</span><span class="mi">09</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">bash</span> +<span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="p">.</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">root</span> <span class="mi">106216</span> <span class="n">Oct</span> <span class="mi">17</span> <span class="mi">2012</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">dash</span> +<span class="n">lrwxrwxrwx</span><span class="p">.</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">root</span> <span class="mi">4</span> <span class="n">Mar</span> <span class="mi">22</span> <span class="mi">10</span><span class="o">:</span><span class="mi">22</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span> <span class="o">-&gt;</span> <span class="n">bash</span> +</pre></div> + + +<p>但在Mac OS上不是,/bin/sh和/bin/bash是两个不同的文件,尽管它们的大小只相差100字节左右:</p> +<div class="highlight"><pre><span class="nl">iMac:</span><span class="o">~</span> <span class="n">wuxiao</span><span class="err">$</span> <span class="n">ls</span> <span class="o">-</span><span class="n">l</span> <span class="o">/</span><span class="n">bin</span><span class="o">/*</span><span class="n">sh</span> +<span class="o">-</span><span class="n">r</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">1371648</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">bash</span> +<span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">2</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">772992</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">csh</span> +<span class="o">-</span><span class="n">r</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">2180736</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">ksh</span> +<span class="o">-</span><span class="n">r</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">1371712</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span> +<span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">2</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">772992</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">tcsh</span> +<span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">wheel</span> <span class="mi">1103984</span> <span class="mi">6</span> <span class="n">Nov</span> <span class="mi">16</span><span class="o">:</span><span class="mi">52</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">zsh</span> +</pre></div> + + +<h4 id="_5">高级编程语言<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4> +<p>理论上讲,只要一门语言提供了解释器(而不仅是编译器),这门语言就可以胜任脚本编程,常见的解释型语言都是可以用作脚本编程的,如:Perl、Tcl、Python、PHP、Ruby。Perl是最老牌的脚本编程语言了,Python这些年也成了一些linux发行版的预置解释器。</p> +<p>编译型语言,只要有解释器,也可以用作脚本编程,如C shell是内置的(/bin/csh),Java有第三方解释器Jshell,Ada有收费的解释器AdaScript。</p> +<p>如下是一个PHP Shell Script示例(假设文件名叫test.php):</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2 +3 +4</pre></div></td><td class="code"><div class="highlight"><pre><span class="x">#!/usr/bin/php</span> +<span class="cp">&lt;?php</span> +<span class="k">for</span> <span class="p">(</span><span class="nv">$i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nv">$i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nv">$i</span><span class="o">++</span><span class="p">)</span> + <span class="k">echo</span> <span class="nv">$i</span> <span class="o">.</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">;</span> +</pre></div> +</td></tr></table> + +<p>执行:</p> +<div class="highlight"><pre><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">php</span> <span class="n">test</span><span class="p">.</span><span class="n">php</span> +<span class="err">或者:</span> +<span class="n">chmod</span> <span class="o">+</span><span class="n">x</span> <span class="n">test</span><span class="p">.</span><span class="n">php</span> +<span class="p">.</span><span class="o">/</span><span class="n">test</span><span class="p">.</span><span class="n">php</span> +</pre></div> + + +<h2 id="shell_1">如何选择shell编程语言<a class="headerlink" href="#shell_1" title="Permanent link">&para;</a></h2> +<h3 id="vs">熟悉 vs 陌生<a class="headerlink" href="#vs" title="Permanent link">&para;</a></h3> +<p>如果你已经掌握了一门编程语言(如PHP、Python、Java、JavaScript),建议你就直接使用这门语言编写脚本程序,虽然某些地方会有点啰嗦,但你能利用在这门语言领域里的经验(单元测试、单步调试、IDE、第三方类库)。</p> +<p>新增的学习成本很小,只要学会怎么使用shell解释器(Jshell、AdaScript)就可以了。</p> +<h3 id="vs_1">简单 vs 高级<a class="headerlink" href="#vs_1" title="Permanent link">&para;</a></h3> +<p>如果你觉得自己熟悉的语言(如Java、C)写shell脚本实在太啰嗦,你只是想做一些备份文件、安装软件、下载数据之类的事情,学着使用sh,bash会是一个好主意。</p> +<p>shell只定义了一个非常简单的编程语言,所以,如果你的脚本程序复杂度较高,或者要操作的数据结构比较复杂,那么还是应该使用Python、Perl这样的脚本语言,或者是你本来就已经很擅长的高级语言。因为sh和bash在这方面很弱,比如说:</p> +<ul> +<li>它的函数只能返回字串,无法返回数组</li> +<li>它不支持面向对象,你无法实现一些优雅的设计模式</li> +<li>它是解释型的,一边解释一边执行,连PHP那种预编译都不是,如果你的脚本包含错误(例如调用了不存在的函数),只要没执行到这一行,就不会报错</li> +</ul> +<h3 id="_6">环境兼容性<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3> +<p>如果你的脚本是提供给别的用户使用,使用sh或者bash,你的脚本将具有最好的环境兼容性,perl很早就是linux标配了,python这些年也成了一些linux发行版的标配,至于mac os,它默认安装了perl、python、ruby、php、java等主流编程语言。</p> +<h2 id="shell_2">第一个shell脚本<a class="headerlink" href="#shell_2" title="Permanent link">&para;</a></h2> +<h3 id="_7">编写<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h3> +<p>打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。</p> +<p>输入一些代码,第一行一般是这样:</p> +<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 +2</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/bash</span> +<span class="c">#!/usr/bin/php</span> +</pre></div> +</td></tr></table> + +<p>“#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。</p> +<h3 id="_8">运行<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h3> +<p>运行Shell脚本有两种方法:</p> +<h4 id="_9">作为可执行程序<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">chmod</span> <span class="o">+</span><span class="n">x</span> <span class="n">test</span><span class="p">.</span><span class="n">sh</span> +<span class="p">.</span><span class="o">/</span><span class="n">test</span><span class="p">.</span><span class="n">sh</span> +</pre></div> + + +<p>注意,一定要写成./test.sh,而不是test.sh,运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。</p> +<p>通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。</p> +<p>这里的"系统",其实就是shell这个应用程序(想象一下Windows Explorer),但我故意写成系统,是方便理解,既然这个系统就是指shell,那么一个使用/bin/sh作为解释器的脚本是不是可以省去第一行呢?是的。</p> +<h4 id="_10">作为解释器参数<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h4> +<p>这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:</p> +<div class="highlight"><pre><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span> <span class="n">test</span><span class="p">.</span><span class="n">sh</span> +<span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">php</span> <span class="n">test</span><span class="p">.</span><span class="n">php</span> +</pre></div> + + +<p>这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。</p> +<h2 id="_11">变量<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h2> +<h3 id="_12">定义变量<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h3> +<p>定义变量时,变量名不加美元符号($),如:</p> +<div class="highlight"><pre><span class="n">your_name</span><span class="o">=</span><span class="s">&quot;qinjx&quot;</span> +</pre></div> + + +<p>注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。</p> +<p>除了显式地直接赋值,还可以用语句给变量赋值,如:</p> +<div class="highlight"><pre><span class="k">for</span> <span class="n">file</span> <span class="n">in</span> <span class="err">`</span><span class="n">ls</span> <span class="o">/</span><span class="n">etc</span><span class="err">`</span> +</pre></div> + + +<h3 id="_13">使用变量<a class="headerlink" href="#_13" title="Permanent link">&para;</a></h3> +<p>使用一个定义过的变量,只要在变量名前面加美元符号即可,如:</p> +<div class="highlight"><pre>your_name=&quot;qinjx&quot; +echo <span class="nv">$your_name</span> +echo <span class="cp">${</span><span class="n">your_name</span><span class="cp">}</span> +</pre></div> + + +<p>变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:</p> +<div class="highlight"><pre>for skill in Ada Coffe Action Java do + echo &quot;I am good at <span class="cp">${</span><span class="n">skill</span><span class="cp">}</span>Script&quot; +done +</pre></div> + + +<p>如果不给skill变量加花括号,写成echo "I am good at <span class="math">\(skillScript",解释器就会把\)</span>skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。</p> +<p>推荐给所有变量加上花括号,这是个好的编程习惯。IntelliJ IDEA编写shell script时,IDE就会提示加花括号。</p> +<h3 id="_14">重定义变量<a class="headerlink" href="#_14" title="Permanent link">&para;</a></h3> +<p>已定义的变量,可以被重新定义,如:</p> +<div class="highlight"><pre><span class="n">your_name</span><span class="o">=</span><span class="s">&quot;qinjx&quot;</span> +<span class="n">echo</span> <span class="err">$</span><span class="n">your_name</span> + +<span class="n">your_name</span><span class="o">=</span><span class="s">&quot;alibaba&quot;</span> +<span class="n">echo</span> <span class="err">$</span><span class="n">your_name</span> +</pre></div> + + +<p>这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符。</p> +<h2 id="_15">注释<a class="headerlink" href="#_15" title="Permanent link">&para;</a></h2> +<p>以“#”开头的行就是注释,会被解释器忽略。</p> +<h3 id="_16">多行注释<a class="headerlink" href="#_16" title="Permanent link">&para;</a></h3> +<p>sh里没有多行注释,只能每一行加一个#号。就像这样:</p> +<div class="highlight"><pre><span class="c">#--------------------------------------------</span> +<span class="c"># 这是一个自动打ipa的脚本,基于webfrogs的ipa-build书写:https://github.com/webfrogs/xcode_shell/blob/master/ipa-build</span> + +<span class="c"># 功能:自动为etao ios app打包,产出物为14个渠道的ipa包</span> +<span class="c"># 特色:全自动打包,不需要输入任何参数</span> +<span class="c">#--------------------------------------------</span> + +<span class="c">##### 用户配置区 开始 #####</span> +<span class="c">#</span> +<span class="c">#</span> +<span class="c"># 项目根目录,推荐将此脚本放在项目的根目录,这里就不用改了</span> +<span class="c"># 应用名,确保和Xcode里Product下的target_name.app名字一致</span> +<span class="c">#</span> +<span class="c">##### 用户配置区 结束 #####</span> +</pre></div> + + +<p>如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。</p> +<h2 id="_17">字符串<a class="headerlink" href="#_17" title="Permanent link">&para;</a></h2> +<p>字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了,哈哈),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。</p> +<h3 id="_18">单引号<a class="headerlink" href="#_18" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">str</span><span class="o">=</span><span class="err">&#39;</span><span class="n">this</span> <span class="n">is</span> <span class="n">a</span> <span class="n">string</span><span class="err">&#39;</span> +</pre></div> + + +<p>单引号字符串的限制:</p> +<ul> +<li>单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的</li> +<li>单引号字串中不能出现单引号(对单引号使用转义符后也不行)</li> +</ul> +<h3 id="_19">双引号<a class="headerlink" href="#_19" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">your_name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">qinjx</span><span class="err">&#39;</span> +<span class="n">str</span><span class="o">=</span><span class="s">&quot;Hello, I know your are </span><span class="se">\&quot;</span><span class="s">$your_name</span><span class="se">\&quot;</span><span class="s">! </span><span class="se">\n</span><span class="s">&quot;</span> +</pre></div> + + +<ul> +<li>双引号里可以有变量</li> +<li>双引号里可以出现转义字符</li> +</ul> +<h3 id="_20">字符串操作<a class="headerlink" href="#_20" title="Permanent link">&para;</a></h3> +<h4 id="_21">拼接字符串<a class="headerlink" href="#_21" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre>your_name=&quot;qinjx&quot; +greeting=&quot;hello, &quot;<span class="nv">$your_name</span>&quot; !&quot; +greeting_1=&quot;hello, <span class="cp">${</span><span class="n">your_name</span><span class="cp">}</span> !&quot; + +echo <span class="nv">$greeting</span> <span class="nv">$greeting_1</span> +</pre></div> + + +<h4 id="_22">获取字符串长度:<a class="headerlink" href="#_22" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre>string=&quot;abcd&quot; +echo <span class="cp">${</span><span class="c">#string</span><span class="cp">}</span> #输出 4 +</pre></div> + + +<h4 id="_23">提取子字符串<a class="headerlink" href="#_23" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre>string=&quot;alibaba is a great company&quot; +echo <span class="cp">${</span><span class="n">string</span><span class="p">:</span><span class="mi">1</span><span class="p">:</span><span class="mi">4</span><span class="cp">}</span> //输出liba +</pre></div> + + +<h4 id="_24">查找子字符串<a class="headerlink" href="#_24" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">string</span><span class="o">=</span><span class="s">&quot;alibaba is a great company&quot;</span> +<span class="n">echo</span> <span class="err">`</span><span class="n">expr</span> <span class="n">index</span> <span class="s">&quot;$string&quot;</span> <span class="n">is</span><span class="err">`</span> +</pre></div> + + +<h4 id="_25">更多<a class="headerlink" href="#_25" title="Permanent link">&para;</a></h4> +<p>参见本文档末尾的参考资料中<a href="http://tldp.org/LDP/abs/html/string-manipulation.html">Advanced Bash-Scripting Guid Chapter 10.1</a></p> +<h2 id="_26">数组<a class="headerlink" href="#_26" title="Permanent link">&para;</a></h2> +<h2 id="_27">管道<a class="headerlink" href="#_27" title="Permanent link">&para;</a></h2> +<h2 id="_28">条件判断<a class="headerlink" href="#_28" title="Permanent link">&para;</a></h2> +<h2 id="_29">流程控制<a class="headerlink" href="#_29" title="Permanent link">&para;</a></h2> +<p>和Java、PHP等语言不一样,sh的流程控制不可为空,如:</p> +<div class="highlight"><pre><span class="cp">&lt;?php</span> +<span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s2">&quot;q&quot;</span><span class="p">]))</span> <span class="p">{</span> + <span class="nx">search</span><span class="p">(</span><span class="nx">q</span><span class="p">);</span> +<span class="p">}</span> +<span class="k">else</span> <span class="p">{</span> + <span class="c1">//do nothing</span> +<span class="p">}</span> +</pre></div> + + +<p>在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else,就像这样</p> +<h3 id="if-else">if else<a class="headerlink" href="#if-else" title="Permanent link">&para;</a></h3> +<h4 id="if">if<a class="headerlink" href="#if" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">if</span> <span class="n">condition</span> +<span class="n">then</span> + <span class="n">command1</span> + <span class="n">command2</span> + <span class="p">...</span> + <span class="n">commandN</span> +<span class="n">fi</span> +</pre></div> + + +<p>写成一行(适用于终端命令提示符):</p> +<div class="highlight"><pre><span class="k">if</span> <span class="err">`</span><span class="n">ps</span> <span class="o">-</span><span class="n">ef</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">ssh</span><span class="err">`</span><span class="p">;</span> <span class="n">then</span> <span class="n">echo</span> <span class="n">hello</span><span class="p">;</span> <span class="n">fi</span> +</pre></div> + + +<p>末尾的fi就是if倒过来拼写,后面还会遇到类似的</p> +<h4 id="if-else_1">if else<a class="headerlink" href="#if-else_1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">if</span> <span class="n">condition</span> +<span class="n">then</span> + <span class="n">command1</span> + <span class="n">command2</span> + <span class="p">...</span> + <span class="n">commandN</span> +<span class="k">else</span> + <span class="n">command</span> +<span class="n">fi</span> +</pre></div> + + +<h4 id="if-else-if-else">if else-if else<a class="headerlink" href="#if-else-if-else" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">if</span> <span class="n">condition1</span> +<span class="n">then</span> + <span class="n">command1</span> +<span class="n">elif</span> <span class="n">condition2</span> + <span class="n">command2</span> +<span class="k">else</span> + <span class="n">commandN</span> +<span class="n">fi</span> +</pre></div> + + +<h3 id="for-while">for while<a class="headerlink" href="#for-while" title="Permanent link">&para;</a></h3> +<h4 id="for">for<a class="headerlink" href="#for" title="Permanent link">&para;</a></h4> +<p>在开篇的示例里演示过了:</p> +<div class="highlight"><pre><span class="k">for</span> <span class="n">var</span> <span class="n">in</span> <span class="n">item1</span> <span class="n">item2</span> <span class="p">...</span> <span class="n">itemN</span> +<span class="k">do</span> + <span class="n">command1</span> + <span class="n">command2</span> + <span class="p">...</span> + <span class="n">commandN</span> +<span class="n">done</span> +</pre></div> + + +<p>写成一行:</p> +<div class="highlight"><pre><span class="k">for</span> <span class="n">var</span> <span class="n">in</span> <span class="n">item1</span> <span class="n">item2</span> <span class="p">...</span> <span class="n">itemN</span><span class="p">;</span> <span class="k">do</span> <span class="n">command1</span><span class="p">;</span> <span class="n">command2</span><span class="err">…</span> <span class="n">done</span><span class="p">;</span> +</pre></div> + + +<h4 id="cfor">C风格的for<a class="headerlink" href="#cfor" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">for</span> <span class="p">((</span> <span class="n">EXP1</span><span class="p">;</span> <span class="n">EXP2</span><span class="p">;</span> <span class="n">EXP3</span> <span class="p">))</span> +<span class="k">do</span> + <span class="n">command1</span> + <span class="n">command2</span> + <span class="n">command3</span> +<span class="n">done</span> +</pre></div> + + +<h4 id="while">while<a class="headerlink" href="#while" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">while</span> <span class="n">condition</span> +<span class="k">do</span> + <span class="n">command</span> +<span class="n">done</span> +</pre></div> + + +<h4 id="_30">无限循环<a class="headerlink" href="#_30" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="k">while</span> <span class="o">:</span> +<span class="k">do</span> + <span class="n">command</span> +<span class="n">done</span> +</pre></div> + + +<p>或者</p> +<div class="highlight"><pre><span class="k">while</span> <span class="nb">true</span> +<span class="k">do</span> + <span class="n">command</span> +<span class="n">done</span> +</pre></div> + + +<p>或者</p> +<div class="highlight"><pre><span class="k">for</span> <span class="p">((</span> <span class="p">;</span> <span class="p">;</span> <span class="p">))</span> +</pre></div> + + +<h4 id="until">until<a class="headerlink" href="#until" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">until</span> <span class="n">condition</span> +<span class="k">do</span> + <span class="n">command</span> +<span class="n">done</span> +</pre></div> + + +<h3 id="case">case<a class="headerlink" href="#case" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre>case &quot;<span class="cp">${</span><span class="n">opt</span><span class="cp">}</span>&quot; in + &quot;Install-Puppet-Server&quot; ) + install_master $1 + exit + ;; + + &quot;Install-Puppet-Client&quot; ) + install_client $1 + exit + ;; + + &quot;Config-Puppet-Server&quot; ) + config_puppet_master + exit + ;; + + &quot;Config-Puppet-Client&quot; ) + config_puppet_client + exit + ;; + + &quot;Exit&quot; ) + exit + ;; + + * ) echo &quot;Bad option, please choose again&quot; +esac +</pre></div> + + +<p>case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break</p> +<h2 id="_31">函数<a class="headerlink" href="#_31" title="Permanent link">&para;</a></h2> +<h3 id="_32">定义<a class="headerlink" href="#_32" title="Permanent link">&para;</a></h3> +<h3 id="_33">调用<a class="headerlink" href="#_33" title="Permanent link">&para;</a></h3> +<h2 id="_34">文件包含<a class="headerlink" href="#_34" title="Permanent link">&para;</a></h2> +<p>可以使用source和.关键字,如:</p> +<div class="highlight"><pre><span class="nx">source</span> <span class="p">.</span><span class="o">/</span><span class="kd">function</span><span class="p">.</span><span class="nx">sh</span> +<span class="p">.</span> <span class="p">.</span><span class="o">/</span><span class="kd">function</span><span class="p">.</span><span class="nx">sh</span> +</pre></div> + + +<p>在bash里,source和.是等效的,他们都是读入function.sh的内容并执行其内容(类似PHP里的include),为了更好的可移植性,推荐使用第二种写法。</p> +<h2 id="_35">用户输入<a class="headerlink" href="#_35" title="Permanent link">&para;</a></h2> +<h3 id="_36">执行脚本时传入<a class="headerlink" href="#_36" title="Permanent link">&para;</a></h3> +<h3 id="_37">脚本运行中输入<a class="headerlink" href="#_37" title="Permanent link">&para;</a></h3> +<h3 id="select">select菜单<a class="headerlink" href="#select" title="Permanent link">&para;</a></h3> +<h2 id="stdinstdout">stdin和stdout<a class="headerlink" href="#stdinstdout" title="Permanent link">&para;</a></h2> +<h2 id="_38">常用的命令<a class="headerlink" href="#_38" title="Permanent link">&para;</a></h2> +<p>sh脚本结合系统命令便有了强大的威力,在字符处理领域,有grep、awk、sed三剑客,grep负责找出特定的行,awk能将行拆分成多个字段,sed则可以实现更新插入删除等写操作。</p> +<h3 id="ps">ps<a class="headerlink" href="#ps" title="Permanent link">&para;</a></h3> +<p>查看进程列表</p> +<h3 id="grep">grep<a class="headerlink" href="#grep" title="Permanent link">&para;</a></h3> +<h4 id="grep_1">排除grep自身<a class="headerlink" href="#grep_1" title="Permanent link">&para;</a></h4> +<h4 id="target">查找与target相邻的结果<a class="headerlink" href="#target" title="Permanent link">&para;</a></h4> +<h3 id="awk">awk<a class="headerlink" href="#awk" title="Permanent link">&para;</a></h3> +<h3 id="sed">sed<a class="headerlink" href="#sed" title="Permanent link">&para;</a></h3> +<h4 id="_39">插入<a class="headerlink" href="#_39" title="Permanent link">&para;</a></h4> +<h4 id="_40">替换<a class="headerlink" href="#_40" title="Permanent link">&para;</a></h4> +<h4 id="_41">删除<a class="headerlink" href="#_41" title="Permanent link">&para;</a></h4> +<h3 id="xargs">xargs<a class="headerlink" href="#xargs" title="Permanent link">&para;</a></h3> +<h3 id="curl">curl<a class="headerlink" href="#curl" title="Permanent link">&para;</a></h3> +<h2 id="_42">综合案例<a class="headerlink" href="#_42" title="Permanent link">&para;</a></h2> +<h2 id="_43">参考资料<a class="headerlink" href="#_43" title="Permanent link">&para;</a></h2> +<ul> +<li><a href="http://tldp.org/LDP/abs/html/">Advanced Bash-Scripting Guide</a>,非常详细,非常易读,大量example,既可以当入门教材,也可以当做工具书查阅</li> +<li><a href="http://www.tutorialspoint.com/unix/unix-shell.htm">Unix Shell Programming</a></li> +<li><a href="http://bash.cyberciti.biz/guide/Main_Page">Linux Shell Scripting Tutorial - A Beginner's handbook</a></li> +</ul> +<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) { + var align = "center", + indent = "0em", + linebreak = "false"; + + if (false) { + align = (screen.width < 768) ? "left" : align; + indent = (screen.width < 768) ? "0em" : indent; + linebreak = (screen.width < 768) ? 'true' : linebreak; + } + + var mathjaxscript = document.createElement('script'); + mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#'; + mathjaxscript.type = 'text/javascript'; + mathjaxscript.src = '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'; + mathjaxscript[(window.opera ? "innerHTML" : "text")] = + "MathJax.Hub.Config({" + + " config: ['MMLorHTML.js']," + + " TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," + + " jax: ['input/TeX','input/MathML','output/HTML-CSS']," + + " extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," + + " displayAlign: '"+ align +"'," + + " displayIndent: '"+ indent +"'," + + " showMathMenu: true," + + " tex2jax: { " + + " inlineMath: [ ['\\\\(','\\\\)'] ], " + + " displayMath: [ ['$$','$$'] ]," + + " processEscapes: true," + + " preview: 'TeX'," + + " }, " + + " 'HTML-CSS': { " + + " styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," + + " linebreaks: { automatic: "+ linebreak +", width: '90% container' }," + + " }, " + + "}); "; + (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript); +} +</script>WonFri, 08 Nov 2013 00:00:00 +0800tag:wbowam.github.io,2013-11-08:shelljiao-ben-bian-cheng-30fen-zhong-ru-men.htmlShellDjango Media 配置(方法一)http://wbowam.github.io/django-media-pei-zhi-fang-fa-yi.html<h5 id="env">Env:<a class="headerlink" href="#env" title="Permanent link">&para;</a></h5> +<ul> +<li>django==1.4.5</li> +<li>python==2.7</li> +<li>ubuntu==13.04</li> +</ul> +<hr /> +<h3 id="django-static-mediamedia">django 的Static 和 Media配置之Media<a class="headerlink" href="#django-static-mediamedia" title="Permanent link">&para;</a></h3> +<h3 id="settingspy">settings.py<a class="headerlink" href="#settingspy" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="cp">##added by Tulpar,20140514</span> +<span class="n">import</span> <span class="n">os</span> +<span class="n">settings_dir</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">)</span> +<span class="n">PROJECT_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">settings_dir</span><span class="p">))</span> + +<span class="n">MEDIA_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">public</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">MEDIA_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span> +</pre></div> + + +<h3 id="urlspy">urls.py<a class="headerlink" href="#urlspy" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="err">#</span><span class="vi">#added</span> <span class="k">by</span> <span class="nx">Tulpar</span><span class="p">,</span><span class="mi">20140514</span> +<span class="nb">from</span> <span class="nx">django.conf</span> <span class="k">import</span> <span class="nx">settings</span> + +<span class="nx">urlpatterns</span> <span class="o">+=</span> <span class="nx">patterns</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> + <span class="nb">url</span><span class="p">(</span><span class="nb">r</span><span class="s2">&quot;^media/(?P&lt;path&gt;.*)$&quot;</span><span class="p">,</span><span class="s2">&quot;django.views.static.serve&quot;</span><span class="p">,{</span><span class="s2">&quot;document_root&quot;</span><span class="p">:</span> <span class="nx">settings.MEDIA_ROOT</span><span class="p">,}),</span> +<span class="p">)</span> +</pre></div>WonSat, 14 Sep 2013 00:00:00 +0800tag:wbowam.github.io,2013-09-14:django-media-pei-zhi-fang-fa-yi.htmlDjangoDjango-userena 的使用http://wbowam.github.io/django-userena-de-shi-yong.html<hr /> +<p>先Clone <a href="https://github.com/bread-and-pepper/django-userena.git">Github上的源码</a>,运行Demo看看效果,</p> +<div class="highlight"><pre><span class="err">进入</span><span class="n">demo</span><span class="err">目录</span> + <span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">r</span> <span class="n">requirements</span><span class="p">.</span><span class="n">txt</span> +<span class="p">(</span><span class="err">再装一个</span><span class="n">html2text</span><span class="p">)</span> +<span class="n">pip</span> <span class="n">install</span> <span class="n">html2text</span> +<span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">runserver</span> +</pre></div> + + +<p>然后再自己搭一个,如下步骤</p> +<hr /> +<h3 id="_1">安装<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<p><code>pip install django-userena</code></p> +<h3 id="_2">配置<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<h4 id="1-add-userena-guardian-easy_thumbnails-to-your-installed_apps-tuple">1. add ’userena’, ’guardian’, ’easy_thumbnails’ to your INSTALLED_APPS tuple.<a class="headerlink" href="#1-add-userena-guardian-easy_thumbnails-to-your-installed_apps-tuple" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="err">’</span><span class="n">userena</span><span class="err">’</span><span class="p">,</span> +<span class="err">’</span><span class="n">guardian</span><span class="err">’</span><span class="p">,</span> +<span class="err">’</span><span class="n">easy_thumbnails</span><span class="err">’</span><span class="p">,</span> +</pre></div> + + +<h4 id="2-in-your-settingspy-file-add-the-following">2. in your settings.py file, add the following:<a class="headerlink" href="#2-in-your-settingspy-file-add-the-following" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">AUTHENTICATION_BACKENDS</span> <span class="o">=</span> <span class="p">(</span> + <span class="err">&#39;</span><span class="n">userena</span><span class="p">.</span><span class="n">backends</span><span class="p">.</span><span class="n">UserenaAuthenticationBackend</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">guardian</span><span class="p">.</span><span class="n">backends</span><span class="p">.</span><span class="n">ObjectPermissionBackend</span><span class="err">&#39;</span><span class="p">,</span> + <span class="err">&#39;</span><span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">backends</span><span class="p">.</span><span class="n">ModelBackend</span><span class="err">&#39;</span><span class="p">,</span> + <span class="p">)</span> + +<span class="n">ANONYMOUS_USER_ID</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> +</pre></div> + + +<p>The above is used to get django-guardian working (another Django-Userena dependency that’s automatically installed to control permissions)</p> +<h3 id="3-create-a-new-app-for-your-django-userena-app-named-accountsand-add-it-to-your-installed_apps-tuple-in-your-settingspy-file">3. create a new app for your Django-Userena app named 'accounts'.and add it to your INSTALLED_APPS tuple in your settings.py file.<a class="headerlink" href="#3-create-a-new-app-for-your-django-userena-app-named-accountsand-add-it-to-your-installed_apps-tuple-in-your-settingspy-file" title="Permanent link">&para;</a></h3> +<h3 id="4-copy-the-following-into-accountsmodelspy">4. Copy the following into accounts/models.py:<a class="headerlink" href="#4-copy-the-following-into-accountsmodelspy" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">db</span> <span class="n">import</span> <span class="n">models</span> + +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">contrib</span><span class="p">.</span><span class="n">auth</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">User</span> +<span class="n">from</span> <span class="n">django</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">translation</span> <span class="n">import</span> <span class="n">ugettext</span> <span class="n">as</span> <span class="n">_</span> +<span class="n">from</span> <span class="n">userena</span><span class="p">.</span><span class="n">models</span> <span class="n">import</span> <span class="n">UserenaBaseProfile</span> + +<span class="n">class</span> <span class="n">MyProfile</span><span class="p">(</span><span class="n">UserenaBaseProfile</span><span class="p">)</span><span class="o">:</span> + <span class="n">user</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span><span class="n">unique</span><span class="o">=</span><span class="n">True</span><span class="p">,</span><span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">),</span><span class="n">related_name</span><span class="o">=</span><span class="err">&#39;</span><span class="n">my_profile</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">favourite_snack</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="err">&#39;</span><span class="n">favourite</span> <span class="n">snack</span><span class="err">&#39;</span><span class="p">),</span><span class="n">max_length</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span> +</pre></div> + + +<h3 id="5-next-add-the-following-into-settingspy-file">5. Next add the following into settings.py file :<a class="headerlink" href="#5-next-add-the-following-into-settingspy-file" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">AUTH_PROFILE_MODULE</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">accounts</span><span class="p">.</span><span class="n">MyProfile</span><span class="err">&#39;</span> + +<span class="n">LOGIN_REDIRECT_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">accounts</span><span class="o">/%</span><span class="p">(</span><span class="n">username</span><span class="p">)</span><span class="n">s</span><span class="o">/</span><span class="err">&#39;</span> +<span class="n">LOGIN_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">accounts</span><span class="o">/</span><span class="n">signin</span><span class="o">/</span><span class="err">&#39;</span> +<span class="n">LOGOUT_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">accounts</span><span class="o">/</span><span class="n">signout</span><span class="o">/</span><span class="err">&#39;</span> +</pre></div> + + +<h3 id="6-add-the-following-into-urlspy-under-the-urlpatterns-tuple">6. Add the following into urls.py under the ‘urlpatterns’ tuple:<a class="headerlink" href="#6-add-the-following-into-urlspy-under-the-urlpatterns-tuple" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="p">(</span><span class="n">r</span><span class="err">&#39;</span><span class="o">^</span><span class="n">accounts</span><span class="o">/</span><span class="err">&#39;</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="err">&#39;</span><span class="n">userena</span><span class="p">.</span><span class="n">urls</span><span class="err">&#39;</span><span class="p">)),</span> +</pre></div> + + +<h3 id="7-configure-your-django-smtp-email-settings-to-use-gmail-in-settingspy">7. Configure your Django SMTP email settings to use Gmail in settings.py:<a class="headerlink" href="#7-configure-your-django-smtp-email-settings-to-use-gmail-in-settingspy" title="Permanent link">&para;</a></h3> +<div class="highlight"><pre><span class="n">EMAIL_USE_TLS</span> <span class="o">=</span> <span class="n">True</span> +<span class="n">EMAIL_HOST</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">smtp</span><span class="p">.</span><span class="n">gmail</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">EMAIL_PORT</span> <span class="o">=</span> <span class="mi">587</span> +<span class="n">EMAIL_HOST_USER</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">yourgmailaccount</span><span class="err">@</span><span class="n">gmail</span><span class="p">.</span><span class="n">com</span><span class="err">&#39;</span> +<span class="n">EMAIL_HOST_PASSWORD</span> <span class="o">=</span> <span class="err">&#39;</span><span class="n">yourgmailpassword</span><span class="err">&#39;</span> +</pre></div> + + +<h3 id="8configure-your-media-files-to-use-mugshots">8.Configure your Media files to use mugshots<a class="headerlink" href="#8configure-your-media-files-to-use-mugshots" title="Permanent link">&para;</a></h3> +<h4 id="settingspy">settings.py<a class="headerlink" href="#settingspy" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="cp">##added by Tulpar,20140514</span> +<span class="n">import</span> <span class="n">os</span> +<span class="n">settings_dir</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">)</span> +<span class="n">PROJECT_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">settings_dir</span><span class="p">))</span> + +<span class="n">MEDIA_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">public</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">MEDIA_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span> +</pre></div> + + +<h4 id="urlspy">urls.py<a class="headerlink" href="#urlspy" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="err">#</span><span class="vi">#added</span> <span class="k">by</span> <span class="nx">Tulpar</span><span class="p">,</span><span class="mi">20140514</span> +<span class="nb">from</span> <span class="nx">django.conf</span> <span class="k">import</span> <span class="nx">settings</span> + +<span class="nx">urlpatterns</span> <span class="o">+=</span> <span class="nx">patterns</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> + <span class="nb">url</span><span class="p">(</span><span class="nb">r</span><span class="s2">&quot;^media/(?P&lt;path&gt;.*)$&quot;</span><span class="p">,</span><span class="s2">&quot;django.views.static.serve&quot;</span><span class="p">,{</span><span class="s2">&quot;document_root&quot;</span><span class="p">:</span> <span class="nx">settings.MEDIA_ROOT</span><span class="p">,}),</span> +<span class="p">)</span> +</pre></div> + + +<hr /> +<p>That's All</p> +<h2 id="errors">Errors<a class="headerlink" href="#errors" title="Permanent link">&para;</a></h2> +<h4 id="1ioerror-at-adminaccountmyprofileadd">1.```IOError at /admin/account/myprofile/add/<a class="headerlink" href="#1ioerror-at-adminaccountmyprofileadd" title="Permanent link">&para;</a></h4> +<p>decoder jpeg not available```</p> +<h6 id="pilowjpg">错误原因是Pilow的jpg图片支持组件没有安装<a class="headerlink" href="#pilowjpg" title="Permanent link">&para;</a></h6> +<p>1、先卸载安装的Pillow<br /> +<code>pip uninstall Pillow</code><br /> +2、安装JPEG和FREETYPE2库 </p> +<div class="highlight"><pre><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">libjpeg</span><span class="o">-</span><span class="n">dev</span> +<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">libfreetype6</span><span class="o">-</span><span class="n">dev</span> +</pre></div> + + +<p>3.重新安装Pillow</p> +<div class="highlight"><pre><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">I</span> <span class="n">pillow</span> +</pre></div> + + +<h4 id="2no-such-table-easy-thumbnails-source">2.<code>no such table: easy thumbnails source</code><a class="headerlink" href="#2no-such-table-easy-thumbnails-source" title="Permanent link">&para;</a></h4> +<h5 id="_3">解决方法:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h5> +<p>1.installed app里加</p> +<div class="highlight"><pre> <span class="err">#</span><span class="n">added</span> <span class="n">by</span> <span class="n">Tulpar</span><span class="p">,</span><span class="mi">20140601</span> + <span class="err">&#39;</span><span class="n">easy_thumbnails</span><span class="err">&#39;</span> +</pre></div> + + +<p>2.settins.py里加</p> +<div class="highlight"><pre><span class="cp">##added by Tulpar,20140601</span> +<span class="n">import</span> <span class="n">os</span> +<span class="n">settings_dir</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">)</span> +<span class="n">PROJECT_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">settings_dir</span><span class="p">))</span> + +<span class="n">MEDIA_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">PROJECT_ROOT</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">public</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span><span class="p">)</span> +<span class="n">MEDIA_URL</span> <span class="o">=</span> <span class="err">&#39;</span><span class="o">/</span><span class="n">media</span><span class="o">/</span><span class="err">&#39;</span> +</pre></div> + + +<hr /> +<h3 id="djangoadminuserenaregister">后台使用django默认的admin时,userena已经默认给你register好了<a class="headerlink" href="#djangoadminuserenaregister" title="Permanent link">&para;</a></h3> +<h3 id="xadminregister">后台如果是使用Xadmin,就得自行register一下,如:<a class="headerlink" href="#xadminregister" title="Permanent link">&para;</a></h3> +<p><code>adminx.py</code> </p> +<div class="highlight"><pre><span class="cp">#-*- coding: UTF-8 -*- </span> +<span class="cp">#from django.contrib import admin</span> + +<span class="cp"># Register your models here.</span> +<span class="n">import</span> <span class="n">xadmin</span> + +<span class="n">from</span> <span class="n">models</span> <span class="n">import</span> <span class="n">MyProfile</span> + +<span class="n">class</span> <span class="n">MyProfileAdmin</span><span class="p">(</span><span class="n">object</span><span class="p">)</span><span class="o">:</span> + <span class="err">#</span><span class="n">search_fields</span><span class="o">=</span><span class="p">(</span><span class="err">&#39;</span><span class="n">name</span><span class="sc">&#39;,&#39;</span><span class="n">category</span><span class="sc">&#39;,&#39;</span><span class="n">content</span><span class="err">&#39;</span><span class="p">)</span> + <span class="err">#</span><span class="n">prepopulated_fields</span> <span class="o">=</span> <span class="p">{</span> <span class="err">&#39;</span><span class="n">message</span><span class="err">&#39;</span><span class="o">:</span> <span class="p">[</span><span class="err">&#39;</span><span class="n">name</span><span class="err">&#39;</span><span class="p">]</span> <span class="p">}</span><span class="err">##</span><span class="n">learned</span> <span class="n">at</span> <span class="n">http</span><span class="o">:</span><span class="c1">//www.b-list.org/weblog/2008/dec/24/admin/</span> + <span class="err">#</span><span class="n">exclude</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">created_by</span><span class="err">&#39;</span><span class="p">,)</span> + <span class="err">#</span><span class="n">actions</span> <span class="o">=</span> <span class="p">[</span><span class="n">Songda</span><span class="p">,</span> <span class="p">]</span> + <span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="sc">&#39;,&#39;</span><span class="n">favourite_snack</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">list_display_links</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">,)</span> + <span class="n">ordering</span> <span class="o">=</span> <span class="p">(</span><span class="s">&quot;-user&quot;</span><span class="p">,)</span> + <span class="n">list_filter</span><span class="o">=</span><span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">,)</span><span class="err">#该属性指定可以过滤的列的名字</span><span class="p">,</span> <span class="err">系统会自动生成搜索器</span> + <span class="n">search_fields</span><span class="o">=</span><span class="p">(</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">,)</span><span class="err">#属性指定可以通过搜索框搜索的数据列的名字</span><span class="p">,</span> <span class="err">搜索框搜索使用的是模糊查找的方式</span><span class="p">,</span> <span class="err">一般用来搜素名字等字符串字段</span> + <span class="n">list_export</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">xls</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">xml</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">json</span><span class="err">&#39;</span><span class="p">)</span><span class="err">#该插件在数据列表页面提供了数据导出功能</span><span class="p">,</span> <span class="err">可以导出</span> <span class="n">Excel</span><span class="p">,</span> <span class="n">CSV</span><span class="p">,</span> <span class="n">XML</span><span class="p">,</span> <span class="n">json</span> <span class="err">格式</span><span class="p">.</span> + <span class="err">#</span> <span class="err">这会显示一个下拉列表</span><span class="p">,</span> <span class="err">用户可以选择</span><span class="mi">3</span><span class="err">秒或</span><span class="mi">5</span><span class="err">秒刷新一次页面</span><span class="p">.</span> + <span class="n">refresh_times</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span><span class="mi">500</span><span class="p">)</span> + <span class="n">list_editable</span> <span class="o">=</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">favourite_snack</span><span class="err">&#39;</span><span class="p">)</span> + <span class="n">show_detail_fields</span> <span class="o">=</span> <span class="p">[</span><span class="err">&#39;</span><span class="n">user</span><span class="err">&#39;</span><span class="p">,]</span><span class="err">#该插件可以在列表页中显示相关字段的详细信息</span><span class="p">,</span> <span class="err">使用</span> <span class="n">Ajax</span> <span class="err">在列表页中显示</span><span class="p">.</span> + +<span class="n">xadmin</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="k">register</span><span class="p">(</span><span class="n">MyProfile</span><span class="p">,</span><span class="n">MyProfileAdmin</span><span class="p">)</span> +</pre></div>WonSat, 14 Sep 2013 00:00:00 +0800tag:wbowam.github.io,2013-09-14:django-userena-de-shi-yong.htmlDjangouserenaGit 入门http://wbowam.github.io/git-ru-men.html<p>之前入门过git,只是入门,不明白原理,不会用建分支,没法完成一些稍有难度的工作。因此,一直想再学学,一直是想,直到......<br /> +好朋友wwj推荐<a href="http://igit.linuxtoy.org/">沉浸式学 Git</a>,看了一下:特别喜欢,再学学,走起! +感谢<a href="http://igit.linuxtoy.org/">徐小东</a>,感谢<a href="http://wwj718.github.io/">wwj</a>.</p> +<hr /> +<h3 id="_1">安装<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3> +<h5 id="linux">Linux<a class="headerlink" href="#linux" title="Permanent link">&para;</a></h5> +<p><code>$ apt-get install git</code> <br /> +Or <br /> +<code>$ yum install git-core</code></p> +<h5 id="mac">Mac<a class="headerlink" href="#mac" title="Permanent link">&para;</a></h5> +<p>请参阅<a href="http://git-scm.com/book/en/Getting-Started-Installing-Git">Mac 安装Git</a></p> +<h5 id="windows">windows<a class="headerlink" href="#windows" title="Permanent link">&para;</a></h5> +<p>请参阅 <a href="http://git-scm.com/book/en/Getting-Started-Installing-Git">Windows 安装Git</a></p> +<hr /> +<h3 id="_2">开始使用<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<h4 id="1">1. 创建新仓库<a class="headerlink" href="#1" title="Permanent link">&para;</a></h4> +<div class="highlight"><pre><span class="n">mkdir</span> <span class="n">hello</span> +<span class="n">cd</span> <span class="n">hello</span> +<span class="n">git</span> <span class="n">init</span> +</pre></div> + + +<p>添加新内容 +<code>vim hello.rb</code><br /> +<code>git add hello.rb</code>或<code>git add .</code> <br /> +添加注释 </p> +<div class="highlight"><pre><span class="n">git</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s">&quot;First Commit&quot;</span> +</pre></div> + + +<p>推送改动<br /> +<code>git push origin master</code> </p> +<h4 id="2">2. 检查仓库状态<a class="headerlink" href="#2" title="Permanent link">&para;</a></h4> +<p><code>git status</code></p> +<h4 id="3-history">3. 查看历史(history)<a class="headerlink" href="#3-history" title="Permanent link">&para;</a></h4> +<p>本地 <br /> +<code>git log</code><br /> +线上的版本<br /> +<code>git log --pretty=oneline</code> </p> +<h4 id="4">4.改命令别名<a class="headerlink" href="#4" title="Permanent link">&para;</a></h4> +<p>这个很有用。以前重复敲很多很长的命令——烦!这下好了'.'</p> +<h6 id="gitconfig">找到.gitconfig,记得先备份一下啊<a class="headerlink" href="#gitconfig" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="k">[alias]</span> + <span class="na">co</span> <span class="o">=</span> <span class="s">checkout</span> +<span class="s"> ci = commit</span> +<span class="s"> st = status</span> +<span class="s"> br = branch</span> +<span class="s"> hist = log --pretty=format:&#39;%h %ad | %s%d [%an]&#39; --graph --date=short</span> +<span class="s"> type = cat-file -t</span> +<span class="s"> dump = cat-file -p</span> +</pre></div> + + +<h4 id="5">5.检出仓库<a class="headerlink" href="#5" title="Permanent link">&para;</a></h4> +<h6 id="_3">执行如下命令以创建一个本地仓库的克隆版本:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h6> +<p><code>git clone /path/to/repository</code> </p> +<h5 id="_4">创建一个远程仓库的克隆版本:<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h5> +<p><code>git clone username@host:/path/to/repository</code></p> +<h3 id="6">6.分支<a class="headerlink" href="#6" title="Permanent link">&para;</a></h3> +<p>分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”。在其他分支上进行开发,完成后再将它们合并到主分支上。<a href="http://www.bootcss.com/p/git-guide/img/branches.png">原理图</a> </p> +<h5 id="feature_x">创建一个叫做“feature_x”的分支,并切换过去:<a class="headerlink" href="#feature_x" title="Permanent link">&para;</a></h5> +<p><code>git checkout -b feature_x</code></p> +<h6 id="_5">切换回主分支:<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h6> +<p><code>git checkout master</code></p> +<h6 id="feature_x_1">再切换到分支feature_x:<a class="headerlink" href="#feature_x_1" title="Permanent link">&para;</a></h6> +<p><code>git checkout feature_x</code></p> +<h5 id="_6">删除分支<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h5> +<p><code>git branch -d feature_x</code> </p> +<h6 id="_7"><strong>所有的操作之后别忘了推送</strong><a class="headerlink" href="#_7" title="Permanent link">&para;</a></h6> +<h4 id="7">7.更新与合并<a class="headerlink" href="#7" title="Permanent link">&para;</a></h4> +<p>更新<br /> +<code>git pull</code> +合并<br /> +<code>git merge &lt;branch&gt;</code></p> +<hr /> +<p>先就这些吧,谢谢光顾!</p>WonSun, 08 Sep 2013 00:00:00 +0800tag:wbowam.github.io,2013-09-08:git-ru-men.htmlGitgit 取消错误的上传http://wbowam.github.io/git-qu-xiao-cuo-wu-de-shang-chuan.html<h5 id="stackoverflow">参考<a href="http://stackoverflow.com/questions/448919/how-can-i-remove-a-commit-on-github">Stackoverflow</a><a class="headerlink" href="#stackoverflow" title="Permanent link">&para;</a></h5> +<h4 id="_1">通过如下命令显示最近的上传情况<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<p><code>git rebase -i HEAD~3</code> </p> +<h6 id="2head10">将会显示最近的2个上传,也可以显示任意个,如<code>HEAD~10</code><a class="headerlink" href="#2head10" title="Permanent link">&para;</a></h6> +<div class="highlight"><pre><span class="n">pick</span> <span class="n">d877e57</span> <span class="o">%</span><span class="n">s</span> +<span class="n">pick</span> <span class="n">f032eda</span> <span class="o">%</span><span class="n">s</span> +<span class="n">pick</span> <span class="n">e545efa</span> <span class="n">jiali</span> + +<span class="cp"># Rebase eb78f1f..f032eda onto eb78f1f</span> +<span class="cp">#</span> +<span class="cp"># Commands:</span> +<span class="cp"># p, pick = use commit</span> +<span class="cp"># r, reword = use commit, but edit the commit message</span> +<span class="cp"># e, edit = use commit, but stop for amending</span> +<span class="cp"># s, squash = use commit, but meld into previous commit</span> +<span class="cp"># f, fixup = like &quot;squash&quot;, but discard this commit&#39;s log message</span> +<span class="cp"># x, exec = run command (the rest of the line) using shell</span> +<span class="cp">#</span> +<span class="cp"># If you remove a line here THAT COMMIT WILL BE LOST.</span> +<span class="cp"># However, if you remove everything, the rebase will be aborted.</span> +<span class="cp">#</span> +</pre></div> + + +<p>再此我想取消,备注为“jiali”的上传, </p> +<h4 id="_2">删除第三行<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4> +<h4 id="_3">然后通过下面的命令,强制上传即可<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4> +<p><code>git push origin +master</code> </p>WonTue, 23 Jul 2013 00:00:00 +0800tag:wbowam.github.io,2013-07-23:git-qu-xiao-cuo-wu-de-shang-chuan.htmlGitGithublinux 小技巧(2)http://wbowam.github.io/linux-xiao-ji-qiao-2.html<h3 id="1">1.纯命令行下用鼠标<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3> +<h1 id="gpm">gpm<a class="headerlink" href="#gpm" title="Permanent link">&para;</a></h1> +<h5 id="gpm_1">安装gpm服务<a class="headerlink" href="#gpm_1" title="Permanent link">&para;</a></h5> +<p><code>sudo apt-get install gpm</code></p> +<h5 id="_1">使用<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h5> +<p><code>serviece gpm start</code></p>WonWed, 29 May 2013 00:00:00 +0800tag:wbowam.github.io,2013-05-29:linux-xiao-ji-qiao-2.htmlLinuxcount(*) vs exists()http://wbowam.github.io/count-vs-exists.html<blockquote> +<h5 id="exists-vs-count-the-battle-never-ends">Exists Vs. Count(*) - The battle never ends...<a class="headerlink" href="#exists-vs-count-the-battle-never-ends" title="Permanent link">&para;</a></h5> +<p>I am still amazed at how many of the database applications written today still disregard some basic rules of thumb when it comes to accessing the data. One in particular is the use of COUNT(*) to check to see if there are any rows that match some criteria. + ——Andrew Kelly</p> +</blockquote> +<h4 id="_1">让我们做个了结....<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4> +<hr /> +<h3 id="_2">情景:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3> +<p>判断是否存在<code>cat=”极客“</code>的Article</p> +<h5 id="_3">方法一:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">count</span> <span class="o">=</span> <span class="n">Article</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">cat</span><span class="o">=</span><span class="s">&quot;极客&quot;</span><span class="p">).</span><span class="n">count</span><span class="p">()</span> +<span class="k">if</span> <span class="n">count</span><span class="err">:</span> + <span class="err">#</span> <span class="n">balabala</span><span class="p">...</span> +</pre></div> + + +<p>SQL: <code>SELECT COUNT(*) FROM table_article WHERE cat="极客";</code></p> +<h5 id="_4">方法二:<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h5> +<div class="highlight"><pre><span class="n">exist</span> <span class="o">=</span> <span class="n">Article</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">cat</span><span class="o">=</span><span class="s">&quot;极客&quot;</span><span class="p">).</span><span class="n">exists</span><span class="p">()</span> +<span class="k">if</span> <span class="n">exist</span><span class="o">:</span> + <span class="err">#</span> <span class="n">balabalabala</span><span class="p">....</span> +</pre></div> + + +<p>SQL: <code>EXISTS (SELECT * FROM table_article WHERE cat="极客")</code> <br /> +<a href="http://sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/exists-vs-count-the-battle-never-ends.aspx">查看</a></p> +<h4 id="2cat">当只有2条符合要求的数据(cat="极客")时,查询情况<a class="headerlink" href="#2cat" title="Permanent link">&para;</a></h4> +<ul> +<li>方法一:</li> +</ul> +<div class="highlight"><pre><span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">3</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span> +</pre></div> + + +<ul> +<li>方法二 :+1: </li> +</ul> +<div class="highlight"><pre> <span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">2</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mf">0.</span> +</pre></div> + + +<h4 id="4688">当有4688条符合要求的数据时,查询情况如下<a class="headerlink" href="#4688" title="Permanent link">&para;</a></h4> +<ul> +<li>方法一:</li> +</ul> +<div class="highlight"><pre> <span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">11</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mf">0.</span> +</pre></div> + + +<ul> +<li>方法二 :+1: </li> +</ul> +<div class="highlight"><pre><span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">2</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mf">0.</span> +</pre></div> + + +<h4 id="357121317">当没有索引,有357条符合要求的数据,总共有121317条数据时,查询情况如下<a class="headerlink" href="#357121317" title="Permanent link">&para;</a></h4> +<ul> +<li>方法一:</li> +</ul> +<div class="highlight"><pre> <span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">1241</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">331</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mf">0.</span> +</pre></div> + + +<ul> +<li>方法二 :+1: </li> +</ul> +<div class="highlight"><pre><span class="n">Scan</span> <span class="n">count</span> <span class="mi">1</span><span class="p">,</span> +<span class="n">logical</span> <span class="n">reads</span> <span class="mi">5</span><span class="p">,</span> +<span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">logical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">physical</span> <span class="n">reads</span> <span class="mi">0</span><span class="p">,</span> +<span class="n">lob</span> <span class="n">read</span><span class="o">-</span><span class="n">ahead</span> <span class="n">reads</span> <span class="mf">0.</span> +</pre></div>WonMon, 04 Feb 2013 00:00:00 +0800tag:wbowam.github.io,2013-02-04:count-vs-exists.htmlMysql \ No newline at end of file diff --git a/ge-shi-hua-zi-fu-chuan-shi-jian.html b/ge-shi-hua-zi-fu-chuan-shi-jian.html new file mode 100644 index 0000000..f741605 --- /dev/null +++ b/ge-shi-hua-zi-fu-chuan-shi-jian.html @@ -0,0 +1,169 @@ + + + + + + + + + + 格式化字符串——时间 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/git-fu-xi-gong-gu-1.html b/git-fu-xi-gong-gu-1.html index 32383ad..aa92094 100644 --- a/git-fu-xi-gong-gu-1.html +++ b/git-fu-xi-gong-gu-1.html @@ -110,7 +110,7 @@

    Category

    Tags

    diff --git a/git-fu-xi-gong-gu-2.html b/git-fu-xi-gong-gu-2.html index 149968d..9bdb713 100644 --- a/git-fu-xi-gong-gu-2.html +++ b/git-fu-xi-gong-gu-2.html @@ -147,7 +147,7 @@

    Category

    Tags

    diff --git a/git-fu-xi-gong-gu-3.html b/git-fu-xi-gong-gu-3.html index aca8ec2..9f51f10 100644 --- a/git-fu-xi-gong-gu-3.html +++ b/git-fu-xi-gong-gu-3.html @@ -99,7 +99,7 @@

    Category

    Tags

    diff --git a/git-fu-xi-gong-gu-4.html b/git-fu-xi-gong-gu-4.html index 2bdada9..c608aed 100644 --- a/git-fu-xi-gong-gu-4.html +++ b/git-fu-xi-gong-gu-4.html @@ -127,7 +127,7 @@

    Category

    Tags

    diff --git a/git-fu-xi-gong-gu-5.html b/git-fu-xi-gong-gu-5.html index 0d0d729..3e6484e 100644 --- a/git-fu-xi-gong-gu-5.html +++ b/git-fu-xi-gong-gu-5.html @@ -97,7 +97,7 @@

    Category

    Tags

    diff --git a/git-qu-xiao-cuo-wu-de-shang-chuan.html b/git-qu-xiao-cuo-wu-de-shang-chuan.html new file mode 100644 index 0000000..24372b1 --- /dev/null +++ b/git-qu-xiao-cuo-wu-de-shang-chuan.html @@ -0,0 +1,157 @@ + + + + + + + + + + git 取消错误的上传 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/git-ru-men.html b/git-ru-men.html new file mode 100644 index 0000000..987bcd9 --- /dev/null +++ b/git-ru-men.html @@ -0,0 +1,202 @@ + + + + + + + + + + Git 入门 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/githubshang-da-bo-ke.html b/githubshang-da-bo-ke.html new file mode 100644 index 0000000..46f886f --- /dev/null +++ b/githubshang-da-bo-ke.html @@ -0,0 +1,198 @@ + + + + + + + + + + Github上搭博客 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/hui-jia-lu.html b/hui-jia-lu.html new file mode 100644 index 0000000..5d47b59 --- /dev/null +++ b/hui-jia-lu.html @@ -0,0 +1,137 @@ + + + + + + + + + + 回家路 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/i-am-just-testing.html b/i-am-just-testing.html new file mode 100644 index 0000000..7b00e33 --- /dev/null +++ b/i-am-just-testing.html @@ -0,0 +1,422 @@ + + + + + + + + + + I am just Testing · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/index3.html b/index3.html new file mode 100644 index 0000000..7e7a1e6 --- /dev/null +++ b/index3.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/index4.html b/index4.html new file mode 100644 index 0000000..7e7a1e6 --- /dev/null +++ b/index4.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/index5.html b/index5.html new file mode 100644 index 0000000..7e7a1e6 --- /dev/null +++ b/index5.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/index6.html b/index6.html new file mode 100644 index 0000000..7e7a1e6 --- /dev/null +++ b/index6.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/index7.html b/index7.html new file mode 100644 index 0000000..7e7a1e6 --- /dev/null +++ b/index7.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/index8.html b/index8.html new file mode 100644 index 0000000..7e7a1e6 --- /dev/null +++ b/index8.html @@ -0,0 +1,144 @@ + + + + + + + + + Tugqi Biz + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/init__fang-fa.html b/init__fang-fa.html new file mode 100644 index 0000000..d98c437 --- /dev/null +++ b/init__fang-fa.html @@ -0,0 +1,149 @@ + + + + + + + + + + init__()方法 · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/linux-xiao-ji-qiao-1.html b/linux-xiao-ji-qiao-1.html new file mode 100644 index 0000000..f1cea40 --- /dev/null +++ b/linux-xiao-ji-qiao-1.html @@ -0,0 +1,132 @@ + + + + + + + + + + linux 小技巧(1) · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/linux-xiao-ji-qiao-2.html b/linux-xiao-ji-qiao-2.html new file mode 100644 index 0000000..e3e6fe3 --- /dev/null +++ b/linux-xiao-ji-qiao-2.html @@ -0,0 +1,132 @@ + + + + + + + + + + linux 小技巧(2) · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/linuxfen-ge-wen-jian.html b/linuxfen-ge-wen-jian.html index 1f57e45..2e5c840 100644 --- a/linuxfen-ge-wen-jian.html +++ b/linuxfen-ge-wen-jian.html @@ -106,10 +106,10 @@

    Category

    Tags

    diff --git a/linuxhe-bing-wen-jian.html b/linuxhe-bing-wen-jian.html index b0df3bb..95c2acf 100644 --- a/linuxhe-bing-wen-jian.html +++ b/linuxhe-bing-wen-jian.html @@ -119,10 +119,10 @@

    Category

    Tags

    diff --git a/linuxte-bie-qiang-da-he-ling-huo-de-ming-ling-xing-gong-ju-1.html b/linuxte-bie-qiang-da-he-ling-huo-de-ming-ling-xing-gong-ju-1.html new file mode 100644 index 0000000..99cc3ed --- /dev/null +++ b/linuxte-bie-qiang-da-he-ling-huo-de-ming-ling-xing-gong-ju-1.html @@ -0,0 +1,232 @@ + + + + + + + + + + Linux特别强大和灵活的命令行工具 (1) · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ming-ling-xing-xia-shi-yong-virtualbox.html b/ming-ling-xing-xia-shi-yong-virtualbox.html new file mode 100644 index 0000000..d8e07a6 --- /dev/null +++ b/ming-ling-xing-xia-shi-yong-virtualbox.html @@ -0,0 +1,162 @@ + + + + + + + + + + 命令行下使用VirtualBox · Tugqi Biz + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mysql-dai-ma-pian-duan.html b/mysql-dai-ma-pian-duan.html index 051a898..f6a04ba 100644 --- a/mysql-dai-ma-pian-duan.html +++ b/mysql-dai-ma-pian-duan.html @@ -158,6 +158,18 @@

    mysql& 2) Then change ownership: chown mysql.mysql <filename> 3) Now try LOAD DATA INFILE command. It will work. + + + +

    Displaying Query Results Vertically

    +
    select * from name limit 10,1\G;
    +
    + + +

    drop table with foreign Key

    +
    SET foreign_key_checks = 0;
    +drop table ...
    +SET foreign_key_checks = 1;