Python Crash Course 2nd
基于Python 3.7
python之禅 import this
字符串
字符串可以使用""或'',所以在子串中可以嵌套子串例如
‘Messi is the “VIP” winner’。对于字符串还是统一使用""来表示,因为有些句子中有's会导致字串匹配错误。
格式化子串
python 3.6支持f开始的字串格式化语法,与以前的full_name = "{} {}".format(first_name, last_name)等价
1 | first_name = "ada" |
空白符操作
"Languages:\n\tPython\n\tC\n\tJavaScript"在一句字串中增加换行或tab
1 | favorite_language.rstrip() # 去掉右侧空白 |
数字
指数运算 3**2 的值为9
Python在所有需要用到float的地方都会自动转换为float,例如两个整数相除得到的是float
可以在数字间以下划线连接,例如1_000,和1000是等价的。(3.6+)
多个变量同时赋值 x, y, z = 0, 0, 0
列表
动态数组,使用[]表示
可以使用负数索引倒序获取列表中的值,例如mylist[-1],表示获取倒数第一个元素
1 | motorcycles = [] |
list comprehension
通过一个列表表达式生成一个列表
squares = [value**2 for value in range(1, 11)]得到
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
列表切片
1 | players[1:4] # 获取player列表的1,2,3这3个元素的子集 |
元组
不可变immutable 的列表,dimensions = (200, 50)
1 | my_t = (3,) # 定义只有一个元素的元组需要多加一个,号 |
表达式
boolean表达式
关键字 True False
逻辑与 and (age_0 >= 21) and (age_1 >= 21)
逻辑或 or age_0 >= 21 or age_1 >= 21
列表中有某一个元素 'mushrooms' in requested_toppings
列表中没有某一个元素 'mushrooms' not in requested_toppings
1 | if a not in words: |
编程规范
Python Enhancement Proposal (PEP)
PEP 8 说明了编码规范 https://python.org/dev/peps/pep-0008/
变量一般小写和下划线组成
常量全大写
indent使用空格,不用tab
不要写多余的indent,否则可能出现非预期的结果
1 | magicians = ['alice', 'david', 'carolina'] |
操作符前后各加一个空格a == b
Django
开始一个项目之前,一定要写一个项目描述书,包括项目的具体目标,功能,用户交互流程和界面。这样可以保障项目不会偏离,从而正常完成。
本书中的例子是建立一个学习日志的管理系统
设置开发环境
- 配置一个独立的Python虚拟环境
python -m venv py38 会在当前目录下创建一个名为py38的目录,其中是独立的一个python运行环境
激活一个虚拟环境
- windows
py38\Scripts\Activate - Linux
source py38/bin/activate
- windows
安装Django程序库
pip install Django
Django工程
- 新建一个目录djangoweb,在虚拟环境的终端中,进入这个用来放置工程的目录
(py38) E:\djangoweb>django-admin startproject demo .在当前目录下新建一个名为demo的工程,注意当前目录的.一定要有。- 此时会有一个demo工程目录和一个
manage.py文件在当前目录下 - 创建数据库 在当前目录下执行
(py38) E:\djangoweb>python manage.py migrate - 测试服务
python manage.py runserver 8000
manager.py:用来处理管理工程的各种命令,例如迁移数据库,运行服务等
settings.py:django如何与系统交互和管理工程
urls.py:处理URL请求的转发
wsgi.py:web server gateway interfae 用来服务Django创建的文件
- 修改数据库这里都称作migrating the database. 第一次执行migrate命令让django确保数据库和当前工程的状态是匹配的,同时django还会创建一个SQLite数据库文件。
app应用
一个Django工程由多个独立的app组成。
重新打开一个虚拟环境终端,切换到工程目录下即manage.py所在的目录,执行
python manage.py startapp demoapp 创建一个名称为demoapp的应用。系统会创建这个应用使用的model/view/admin.py文件。
在demo工程目录下settings.py中管理了当前所有应用,在其中可以启用我们自定义的应用
1 | INSTALLED_APPS = [ |
自己的app要写在系统默认app之前,可以让自己的app的功能覆盖默认的app的功能。
模型
模型表示数据抽象,和数据库中的一个表对应,例如一本书,它有书名和作者。
一个应用目录中的models.py定义了这个应用的模型。
增加模型
需要在models.py中定义模型的类
1 | # Create your models here. |
这里Topic和Entry作为模型,分别对应了两个数据库表,其中一个Topic和多个Entry关联
更新模型
只要对模型有所修改,即数据表有更改,都需要让Django更新数据表,并进行同步数据库文件。依次执行以下两步:
python manage.py makemigrations demoapp会生成类似demoapp\migrations\0001_initial.py文件,其中是数据表创建的实现代码python manage.py migrate按照数据表的创建代码,更新工程实际的数据库,创建模型对应的数据表
Django 管理站点
自动生成的管理员站点,可以管理工程的数据表。需要先创建一个管理员帐号
python manage.py createsuperuser执行后,会提示输入用户名和密码,而且密码还有长度要求,但是我输入了123虽然不安全,还是可以继续执行。
1 | (py38) E:\code\python\djangoweb>python manage.py createsuperuser |
打开 http://127.0.0.1:8000/admin/ 使用用户名和密码登录后,就可以看到管理页面,默认会有users和groups两个表. 在这个界面可以直接修改数据表的数据
添加模型到管理站点
在应用的admin.py中增加自己定义的模型
1 | from django.contrib import admin |
URL映射
用户访问的url地址通过映射表转给对应的view处理。可以给每个app单独设置一个url映射表。
如果出现ModuleNotFoundError: No module named的错误提示,需要把服务器重新启动一下。
在主工程目录的urls.py中增加app的urls的映射
1 | from django.contrib import admin |
在demoapp的目录中新增一个urls.py文件
1 | """Defines URL patterns for demoapp.""" |
view视图
一个视图函数获取request中的参数信息,处理数据后,将产生的数据发送回浏览器。通常结合模板,将一个页面发送给浏览器。
实现views.py中的index函数
1 | from django.shortcuts import render |
Template模板
模板定义了页面的显示方式,Django把数据填入模板对应的代码片段中。
在demoapp中创建以下目录并创建index.html文件template/demoapp/index.html这样和view中函数的相对路径保持一致。
模板继承
对于每个页面都有的元素,可以通过定义一个父模板,其中实现通用的界面显示部分,在子模板中继承父模板即可。
- 定义一个父模板
base.html其中xxx是为了解决Hexo的nunjunks erro,实际代码不需要
1 | <p> |
``{% %}定义了一个Template tag`.这个代码片段用来生成显示在页面上的信息。
{% url 'demoapp:index' %} 生成一个URL与demoapp/urls.py中的名称为index的url映射匹配,其中的demoapp就是urls.py中定义的app_name
- 定义子模板index.html
1 | { % extends "demoapp/base.html" % } |