0%

Python Django 教程2

本教程将将创建数据库,模型并介绍自动生成的管理员站点。

创建数据库

数据库默认设置在mysite/settings.py文件中的DATABASES中,其中为ENGINE和NAME字段,可以自行更改。

使用

1
$ python manage.py migrate

来生成settings.py文件中需要的数据库表。

创建模型

修改文件polls/models.py文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
from django.db import models


class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')


class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

激活模型

为了可以访问到该模型,需要在INSTLLED_APP参数设置中,添加polls,文件mysite/settings.py内容如下所示:

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

其中polls.aps.PollsConfig位于polls/apps.py文件中

然后使用下述命令来让Django包含polls应用。

1
$ python manage.py makemigrations polls

使用

1
$ python manage.py migrate

来生成settings.py文件中需要的数据库表。

创建模型的三个步骤

  1. Change your models (in models.py).
  2. Run python manage.py makemigrations to create migrations for those changes
  3. Run python manage.py migrate to apply those changes to the database.

玩转API接口

1
$ python manage.py shell

增加易读接口返回

1
2
3
4
5
6
7
8
9
10
11
from django.db import models

class Question(models.Model):
# ...
def __str__(self):
return self.question_text

class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text

Django 管理 Admin

创建管理员账号

1
$ python manage.py createsuperuser

启动服务器

1
$ python manage.py runserver

Now, open a Web browser and go to “/admin/” on your local domain – e.g., http://127.0.0.1:8000/admin/

让poll在admin中可编辑,编辑polls/admin.py文件内容如下:

1
2
3
4
5
from django.contrib import admin

from .models import Question

admin.site.register(Question)

Python Django 教程3

本教程将聚焦于创建公共接口-视图。

Writing more views

更新views页面polls/views.py

1
2
3
4
5
6
7
8
9
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)

def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)

def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)

Write views that actually do something

A shortcut: render()

Raising a 404 error

A shortcut: get_object_or_404()

Use the template system

Removing hardcoded URLs in templates

Namespacing URL names

Python Django 教程4

本教程将主要关注简单的表单处理以及如何对代码进行优化。

编写一个简单的表单

使用通用视图:代码还是少点好

改良 URLconf

改良视图

Python Django 教程5

本教程将主要为Django应用创建自动化测试。

Python Django 教程6

本教程将主要为Django应用添加一张样式表和一张图片。

样式表

创建下列代码:

polls/static/polls/style.css

1
2
3
li a {
color: green;
}

下一步,在polls/templates/polls/index.html的顶端添加如下内容 :

1
2
3
4
polls/templates/polls/index.html
{% load staticfiles %}

<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />

添加背景图片

我们将创建一个子目录来存放图片。 在polls/static/polls/目录中创建一个 images 子目录。在这个目录中,放入一张图片background.gif。换句话,将你的图片放在 polls/static/polls/images/background.gif。

然后,向你的样式表添加(polls/static/polls/style.css):

1
2
3
body {
background: white url("images/background.gif") no-repeat right bottom;
}

重新加载http://localhost:8000/polls/,你应该在屏幕的右下方看到载入的背景图片。

pip使用国内镜像源

pip是Python中非常方便易用的安装包管理器,但是在实际下载安装包的时候总是连接不上或者下载速度特别慢, pypi.python.org就是其中一个。

所以,使用pip给Python安装软件时,经常出现Timeout连接超时错误。修改pip连接的软件库到国内的源可以解决这个问题。

方法如下:

直接修改配置文件

1)检查pip.conf文件是否存在

1
2
3
4
$ cd ~
$ mkdir .pip
$ ls ~/.pip
$

2)直接编辑pip.conf
vi ~/.pip/pip.conf

1
2
3
4
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com

或者

1
2
3
4
5
6
7
8
9
10
11
12
13
[global]  

timeout = 6000

index-url = http://pypi.douban.com/simple/

[install]

use-mirrors = true

mirrors = http://pypi.douban.com/simple/

trusted-host = pypi.douban.com

临时换源

如果只是想临时更改一下,可以使用-i参数,

命令格式:sudo pip3 install 包名 -i 镜像源url

比如:

1
$ pip3 install numpy -i https://pypi.douban.com/simple

简介

pip是Python中非常方便易用的安装包管理器,但是在实际下载安装包的时候总是连接不上或者下载速度特别慢, pypi.python.org就是其中一个。

所以,使用pip给Python安装软件时,经常出现Timeout连接超时错误。修改pip连接的软件库可以解决这个问题。

更新软件

有两种方法,一种可以通过逐个更新模块:

1
2
3
4
5
# 查看所有可更新的模块:  
pip list --outdated

# 更新某一个模块:     
pip install --upgrade module_name
1
2
3
4
5
#安装对应的模块:     
$ pip install pip-review

#更新所有的模块:     
$ pip-review --local --interactive

更新源

方法如下:

直接修改配置文件

1)检查pip.conf文件是否存在

1
2
3
4
$ cd ~
$ mkdir .pip
$ ls ~/.pip
$

2)直接编辑pip.conf
sudo vi ~/.pip/pip.conf

1
2
3
4
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com

或者

1
2
3
4
5
6
7
8
9
10
11
12
13
[global]  

timeout = 6000

index-url = https://pypi.douban.com/simple/

[install]

use-mirrors = true

mirrors = https://pypi.douban.com/simple/

trusted-host = pypi.douban.com

临时换源

命令格式:sudo pip3 install 包名 -i 镜像源url

比如:
sudo pip3 install django -i https://pypi.douban.com/simple

Troubleshooting

1
2
3
4
5
pip install mpi4py
Traceback (most recent call last):
File "~/virtual_evn/bin/pip", line 6, in <module>
from pip._internal.cli.main import main

解决方法:

1
$ export PYTHONPATH=~/virtual_env/lib/python3.7/site-packages/

PyQt界面设计

UI => Python

在Qt的界面开发开发中,设计界面可以使用Qt Creator或者Designer,本质是一样的。

设计完成会生成一个ui后缀的文件,格式其实是xml语言的文本文件。

按照设计比如生成一个window.ui的文件,那么可以使用pyuic来生成python文件,命令如下所示:

1
pyuic5 window.ui -o window.py

此时的window.py文件就是界面的python接口了,接下来我们需要做的就是编写一个程序调用这个界面,简单的如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
from window import *

class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)

self.actionClose.triggered.connect(self.close)
self.actionOpen.triggered.connect(self.openMsg)

if __name__ == '__main__':
app = QApplication(sys.argv)
myWin = MyMainWindow()
myWin.show()
sys.exit(app.exec_())

RC = > Python

PyQt5提供了pyrcc5来将资源文件转化为python文件,默认加上rc后缀与Qt Designer保持一致。命令如下所示:

1
pyrcc5 app.qrc -o app_rc.py

check一下生成的python文件,可以直接调用。

python 环境变量设置PYTHONPATH

PYTHONPATH是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找。

打印PYTHONPATH:

1
2
3
import os
print sys.path
>['', '/usr/local/lib/python2.7/dist-packages/dlib-19.4.0-py2.7-linux-x86_64.egg', '/home/leo',...]

注意:sys.path 也可以用 os.sys.path 替换,两个应该是同一个命令,推荐使用sys.path, 因为 os.sys.path 在python document 中好像没有提及.

设置PYTHONPATH

方法一:命令窗口添加路径

1
export PYTHONPATH=$PYTHONPATH:/home/leo

注意:此方法只在当前命令窗口生效,即如果打开一个新的Terminal 窗口,定位到当前目录, 打印PYTHONPATH 是没有刚才加入的路径的.

方法二:在python 中添加:

1
2
import sys
sys.path.append('/home/leo/')

reStructuredText 简介

reStructuredText (reST) 为文档生成者提供足够的信息. reST 被认为是简单,实用的标记语言,因此学习它不会花太多时间.

See also

读物 reStructuredText User Documentation. 文档内 “ref” 链接指向reST的分类参考文献.

段落

段落 (:duref:ref ) 是reST 文件的基本模块. 段落是由空行分隔的一段文本. 和Python一样, 对齐也是reST的操作符, 因此同一段落的行都是左对齐的.

内联标记

标准的reST 内联标记相当简单:

  • 星号: *text* 是强调 (斜体),
  • 双星号: **text** 重点强调 (加粗),
  • 反引号: text 代码样式.

星号及反引号在文本中容易与内联标记符号混淆,可使用反斜杠符号转义.

标记需注意的一些限制:

  • 不能相互嵌套,
  • 内容前后不能由空白: 这样写* text* 是错误的,
  • 如果内容需要特殊字符分隔. 使用反斜杠转义,如: thisis\ *one*\ word.

这些限制在未来版本可能会被改善.

reST 也允许自定义 “文本解释角色”’, 这意味着可以以特定的方式解释文本. Sphinx以此方式提供语义标记及参考索引,操作符为 :rolename:content``.

标准reST 提供以下规则:

详情请查看 内联标记 .

列表与引用

列表标记 (:duref:ref ) 的使用最自然: 仅在段落的开头放置一个星号和一个缩进. 编号的列表也可以;也可以使用符号 # 自动加序号:

1
2
3
4
5
6
7
8
9
* 这是一个项目符号列表.
* 它有两项,
第二项使用两行.

1. 这是个有序列表.
2. 也有两项.

#. 是个有序列表.
#. 也有两项.

列表可以嵌套,但是需跟父列表使用空行分隔

1
2
3
4
5
6
7
* 这是
* 一个列表

* 嵌套列表
* 子项

* 父列表继续

定义列表 (:duref:ref )

1
2
3
4
5
6
7
术语 (term 文本开头行)
定义术语,必须缩进

可以有多段组成

下一术语(term)
描述.

一行仅能写一个术语.

引用段落 (:duref:ref ) 仅使用缩进(相对于周围段落)创建.

行模块 (:duref:ref ) 可以这样分隔

1
2
3
| 这些行
| 在源文件里
| 被分隔的一模一样.

还有其他有用的模块:

源代码

字面代码块 (:duref:ref ) 在段落的后面使用标记 :: 引出. 代码块必须缩进(同段落,需要与周围文本以空行分隔):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
这是一段正常文本. 下一段是代码文字::

它不需要特别处理,仅是
缩进就可以了.

它可以有多行.

再是正常的文本段.


.. code-block:: c
:linenos:
:emphasize-lines: 3,6 # 高亮显示3、6行

void foo()
{
int i;

for(i=0; i<10; i++)
printf("i: %d\n", a);
}

这个 :: 标记很优雅:

  • 如果作为独立段落存在,则整段都不会出现在文档里.
  • 如果前面有空白,则标记被移除.
  • 如果前面是非空白,则标记被一个冒号取代.

因此上面的例子第一段文字将变为”下一段是代码文字:”.

表格

支持两种表格. 一种是 网格表格 (:duref:ref ), 可以自定义表格的边框. 如下:

1
2
3
4
5
6
7
8
+------------------------+------------+----------+----------+
| Header row, column 1 | Header 2 | Header 3 | Header 4 |
| (header rows optional) | | | |
+========================+============+==========+==========+
| body row 1, column 1 | column 2 | column 3 | column 4 |
+------------------------+------------+----------+----------+
| body row 2 | ... | ... | |
+------------------------+------------+----------+----------+

简单表格 (:duref:ref ) 书写简单, 但有一些限制: 需要有多行,且第一列元素不能分行显示,如下:

1
2
3
4
5
6
7
8
=====  =====  =======
A B A and B
===== ===== =======
False False False
True False False
False True False
True True True
===== ===== =======

超链接

外部链接

使用 ``链接文本 http://example.com/_ 可以插入网页链接. 链接文本是网址,则不需要特别标记,分析器会自动发现文本里的链接或邮件地址.

可以把链接和标签分开 (:duref:ref ), 如下:

1
2
3
段落里包含 `a link`_.

.. _a link: http://example.com/

内部链接

内部链接是Sphinx特定的reST角色, 查看章节 交叉索引的位置.

章节

章节的标题 (:duref:ref ) 在双上划线符号之间(或为下划线), 并且符号的长度不能小于文本的长度:

1
2
3
=================
This is a heading
=================

通常没有专门的符号表示标题的等级,但是对于Python 文档,可以这样认为:

  • # 及上划线表示部分
  • * 及上划线表示章节
  • =, 小章节
  • -, 子章节
  • ^, 子章节的子章节
  • ", 段落

当然也可以标记(查看 reST 文档), 定义章节的层次,但是需要注意输出格式(HTML, LaTeX)所支持的层次深度 .

显式标记

显式标记”Explicit markup” (:duref:ref ) 用在那些需做特殊处理的reST结构中, 如尾注,突出段落,评论,通用指令.

显式标记以 .. 开始,后跟空白符,与下面段落的缩进一样. (在显示标记与正常的段落间需有空行,这听起来有些复杂,但是写起来会非常直观.)

指令

指令 (:duref:ref ) 是显式标记最常用的模块. 也是reST 的扩展规则, 在 Sphinx 经常被用到.

文档工具支持以下指令:

设置不使用指令 :dudir:sectnum, :dudir:header:dudir:footer.

Sphinx 新增指令可查阅 Sphinx标记的组成.

指令有名字,参数,选项及内容组成. (记住这些,在下面一小节中自定义指令里会用到).来看一个例子:

1
2
3
4
5
.. function:: foo(x)
foo(y, z)
:module: some.module.name

返回用户输入的一行文本.

function 是指令名字. 在第一行和第二行给出了两个参数, 及一个选项 module (如你所见,选项在参数后给出,由冒号引出). 选项必须与指令有一样的缩进.

指令的内容在隔开一个空行后,与指令有一样缩进.

图像

reST 支持图像指令 (:dudir:ref ), 如下:

1
2
.. image:: gnu.png
(选项)

这里给出的文件名( gnu.png) 必须是源文件的相对路径,如果是绝对路径则以源目录为根目录. 例如,在文件 sketch/spam.rst 引用图像 images/spam.png ,则使用 ../images/spam.png 或者 /images/spam.png.

Sphinx 会自动将图像文件拷贝到输出目录的子目录里,( 输出HTML时目录为 _static )

图像的大小选项 (widthheight) : 如果没有单位或单位为像素, 给定的尺寸信息仅在输出通道支持像素时才有用 ( 如输出LaTeX 没用). 其他单位在输出(如 pt )HTML、LaTeX 时被用到.

Sphinx 延伸了标准的文档化行为,只需在后面加星号:

1
.. image:: gnu.*

上面这样写,Sphinx 会搜索所有名字匹配的图像,而不管图像类型. 每个生成器则会选择最合适的图像. 一般,在源文件目录里文件名 gnu.* 会含有两个文件 gnu.pdfgnu.png , LaTeX 生成器会选择前者,而HTML 生成器则匹配后者.

Changed in version 0.4: 添加对文件名以星号结束的支持.

Changed in version 0.6: 图像路径可以是绝对路径.

尾注

尾注 (:duref:ref ), 使用 [#name]_ 标记尾注的位置, 尾注的内容则在文档底部红色标题”Footnotes”的后面 , 如下:

1
2
3
4
5
6
Lorem ipsum [#f1]_ dolor sit amet ... [#f2]_

.. rubric:: Footnotes

.. [#f1] 第一条尾注的文本.
.. [#f2] 第二条尾注的文本.

你也可以使用数字尾注 ([1]_) 或使用自动排序的([#]_).

引用

支持标准的reST 引用 (:duref:ref ) , 且新增了”global”特性, 所有参考文献不受所在文件的限制. 如:

1
2
3
Lorem ipsum [Ref]_ dolor sit amet.

.. [Ref] 参考文献, 书,URL 等.

引用的使用同尾注很相近,但是它们没有数字标签或以 # 开始.

替换

reST 支持替换 “substitutions” (:duref:ref ), 有一小段文本或标记被关联到 |name|. 定义与尾注一样需有明确的标记块,如下:

1
.. |name| replace:: replacement *text*

或者:

1
2
.. |caution| image:: warning.png
:alt: Warning!

详情查看 :duref:reST reference for substitutions .

如果想在所有文档中使用这些替换, 需把它们放在 :confval:rst_prolog 或一个单独文件里, 然后在使用它们的文档文件里包含这个文件,包含指令 include . (请给出包含文件的扩展名,已区别于其他的源文件,避免Sphinx将其作为独立的文档文件.)

Sphinx 定义了一些默认的替换, 请查看 替换.

评论

有明确标记块但又不是有效的结构标记的标记 (像上面的尾注)都被视为评论 (:duref:ref ). 例如:

1
.. 这是一个评论.

可以通过缩进产生多行评论:

1
2
3
4
5
..
这整个缩进块都是
一个评论.

仍是一个评论.

源编码

在reST使用Unicode字符可以容易的包含特殊字符如破折号,版权标志. Sphinx 默认源文件使用UTF-8 编码; 你可以通过 :confval:source_encoding 的配置值改变编码.

常见问题

具体使用中可能会遇到一些问题:

  • 内联标记的分离 如上面所讲,内联标记需与周围的文本使用空格分隔, 内联标记内部则使用反斜线转义空格. 查看详情: the reference .
  • 内联标记不能嵌套 像这样写 *see :func:foo* 是不允许的.

Footnotes

[1] 当默认主域里包含指令 class , 这个指令将被隐藏 因此, Sphinx使用 rst-class.

Be sure to say yes to autodoc

More information can refer https://zh-sphinx-doc.readthedocs.io/en/latest/rest.html#id2