Python 后端开发学习路线
Python 后端开发学习路线
从TeaBreak 后端知识库搬运过来的
目标读者是零基础的学生
Week 1 实用工具及技巧
Git和Markdown是必须学习的内容
- Google
- 学会如何用英语描述问题并在Google上找到答案
- 95%的问题都可以解决
- 程序员最应该掌握的语言是英语
- (不想看英文还有Google翻译)
- Stack Overflow而不是CSDN
- 虽然CSDN上也有不少优质内容,但是大部分都是从英文网站翻译过来或者抄袭别的文章
- 个人认为在中文论坛里面,知乎,简书,Segment Fault不错
- 学会如何用英语描述问题并在Google上找到答案
- Git
- Overview
- Basic commands
- add
- commit
- pull
- push
- gitignore
- GitHub
- Pull Request
- Issue
- git clone
- 加入TeaBreak Team
- 在Team下创建一个存放学习笔记的仓库
- 新建仓库后
git clone
到本地 - 将本地git仓库推送到GitHub上
git remote add origin
git remote -v
- 新建仓库后
- 在Team下创建一个存放学习笔记的仓库
- Optional:
- SSH keys https://github.com/settings/keys
- Explore great repositories
- Plugin 浏览器扩展
- Sourcegraph https://about.sourcegraph.com/
- Git图形化界面
- VsCode
- git gui
- TeaBreak Git使用规范
- 参考
- 选IDE
- VsCode
- Pycharm
- etc.
- 掌握Markdown语法
- 本文档就是用Markdown写的
- 又简单又美观
- 用Markdown写学习笔记
- 偷偷推荐一下自己的Blog: https://jasonblog.xyz/2020/01/12/2020/1-6/#toc-heading-1
- 这篇笔记对应的Markdown文件也放在仓库下了
- 写法仅供参考,爱咋写咋写😄
- Optional:
- Typora
- Markdown转换成pdf
- Latex数学公式
- 可以用来写数学作业
- 考虑学习Vim
- Vim是世界上最好的文本编辑器
- 但是学习曲线不友好
- 在大部分IDE中都可以用Vim插件
- 命令行环境下Vim很好用
- 甚至在Chrome中也可以用Vim: Vimium实现无鼠标上网
- 参考
Tasks
- 在GitHub上加入TeaBreak Team并创建你的学习笔记仓库
- 用Markdown完成你的第一篇学习笔记
Week 2 Python语法 & Django入门
Python语法
官方文档:https://docs.python.org/3/
廖雪峰的python教程:https://www.liaoxuefeng.com/wiki/1016959663602400
- 数据类型
- 流程控制
- 条件判断
- 循环
- 函数
- 数据结构
- 列表
- 字典
- 异常处理
- 模块和包
- 以下三种
import
的区别:import json
from json import *
from json import load
- 以下三种
- 类
- 类成员
- 类方法
- 装饰器(选学)
Django入门
官方文档:https://docs.djangoproject.com/zh-hans/3.0/
在实践中学习Django会比较快,哪里不会查哪里,首先在官方文档里找,其次用Google搜索。
- 推荐大家先跟着官方教程做一个简单的应用:https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/
- 在我们团队中,Django仅作为后端使用,且在Django基础上使用了DRF (Django REST Framework)这个后端专用框架。DRF的写法与Django原生的写法差别挺大的,但是这两种写法是可以同时存在的,建议大家先熟悉Django原生的写法,再弄懂DRF帮我们节省了哪些部分的代码工作
- 推荐大家阅读迎新墙和课程二维码的代码来熟悉Django的使用:
models
,views
,urls
三部分各自的作用及联系- 各个
.py
文件的作用 settings.py
及local_settings.py
中的配置- Admin后台管理模块:迎新墙
- 数据库增删查改
QuerySet
- Django 中使用 MySQL 数据库:
- 在本地安装 MySQL
- 安装 MySQL Workbench
- 在 Django 项目的
models.py
中定义数据库表 - 数据库表结构的设计是一大学问,现阶段只需要保证信息完整即可
- 可参考迎新墙的数据库设计
- 主键
primary_key
是每一行数据的唯一标识 - 外键
foreign_key
连接两个表(现阶段不用考虑,活动日历建一个表即可) - Django ORM 常用字段类型
AutoField
自增主键CharField
定长字符串DateTimeField
日期时间PositiveIntegerField
非负整数TextField
长字符串
- 主键
- 在 Django 项目的
settings.py
中定义数据库连接: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': { "host": "127.0.0.1", # 本地的MySQL "port": 3306, "database": "database_name", # 改成你的数据库名字 "user": "your_database_username", # 用户名 "password": "your_database_password", # 密码 }, } }
python manage.py make migrations xxx(项目名字)
创建数据库迁移文件python manage.py migrate
数据库迁移- 数据库增删查改的操作,请参考QuerySet API及问答墙的API
- 推荐大家阅读柠檬茶日历和用户系统的后端代码来熟悉DRF的使用:
- 阅读后端README
- http返回状态码及信息:
Response(msg="not found",status=status.HTTP_404_NOT_FOUND)
显式定义状态码
- 装饰器
- 原理:https://segmentfault.com/a/1190000004461404
- 应用:
@api_view(["POST"])
指定某个接口的http方法@permission_classes([])
DRF中的权限管理@authentication_classes([CustomUserTokenAuth])
DRF中的用户认证
- 欢迎大家来完善原有的后端代码:在企业微信里提出建议 -> 新建分支 -> 在新分支上变更 -> Pull Request 或 直接合并到master
Tasks
- 跟着教程做一个简单的Django应用:https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/
- 探索后端代码:
Week 3 如何在服务器上部署代码
- SSH
- 原理
- 如何实现免密登录服务器
ssh-copy-id username@host
- 常用命令
ls -al
orll
aliaspwd
cd
screen
screen -ls
screen -x <name>
<Ctrl-a> <Ctrl-d>
top
orhtop
mv
cp
- 怎么将代码部署到服务器上
- Git同步或scp同步
- Nginx反向代理
runserver
Week 4 Django REST framework (DRF)
以柠檬茶日历为例
- Tutorial
- Serializer
- 入门内容:
- Serializer与Django原生的写法相比有什么好处
- 结合
serializers.py
一起看 - Dealing with nested objects serialize 外键关系
- Partial updates PATCH接口中使用
- ModelSerializer 最常用的继承
- Specifying which fields to include
fields
orexclude
- 高阶内容:
- 入门内容:
- Authentication
- 用户身份认证,e.g. 辨别出Jason是Jason
- 目前使用的是自定义的Token认证
- 高阶内容:
- 看懂
CustomUserTokenAuth
的逻辑
- 看懂
- Permissions
- 用户权限管理,需要先认证用户的身份,才能根据不同用户给出不同的权限管理策略
DjangoModelPermissions
管理用户对某个 Model 的权限。e.g. 产品初期用户不能访问Host ModelDjangoObjectPermissions
管理用户对某个 Object 的权限。e.g. 缺少event对应通行证的用户将无法访问该event- 高阶内容:
- 弄懂柠檬茶日历的Object Permissions原理:
- 用户在哪里被授权:
assign_perm
toGroup
Group
与Passport
的一对一关系Passport
与 用户系统的同步方式
- 用户的权限在哪里被检查:
DEFAULT_PERMISSION_CLASSES
- Object对象如何被筛选:
filter_backends = [ObjectPermissionsFilter]
- Object Permissions有哪几种
- Filtering
- 模型对象过滤器
CustomEventDeletedFilterBackend
CustomEventOutdatedFilterBackend
的作用- 代码复用
- 代码组件化
- 自己写一个
FilterBackend
- The Browsable API
- 试试直接访问接口路径:https://calendar.dev.tea-break.cn/api/event/
- 自动生成API文档
Week 5 User System Design
- UserSystem README
- 登录系统
Token
设计 - 用户数据同步:
- 只有 UserSystem 才能往 Redis 里面写
token
is_active
- 其他 app 只能读取 Redis 里面的
token
is_active
- 观察者模式(广播)同步passport及用户个人信息
- 只有 UserSystem 才能往 Redis 里面写
- ref:
Week 7 Nginx
nginx.conf
语法- e.g calendar nginx.conf
server { listen 443 ssl; server_name calendar.dev.tea-break.cn; ssl_certificate /home/www/calendar/SSL/dev/Nginx/1_calendar.dev.tea-break.cn_bundle.crt; ssl_certificate_key /home/www/calendar/SSL/dev/Nginx/2_calendar.dev.tea-break.cn.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location /django/static/ { alias /home/www/calendar/django/static/; } location / { root /home/www/calendar/react/build; index index.html index.htm; try_files $uri /index.html autoindex on; } location /api { proxy_pass http://127.0.0.1:8004; } location /uauth { proxy_pass http://127.0.0.1:9000; } location /api/get_cos_credential { proxy_pass https://www.tea-break.cn; } location /T67xT93qKR.txt { root /; expires -1; add_header Cache-Control no-store; } } server { listen 80; server_name calendar.dev.tea-break.cn; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name app.calendar.dev.tea-break.cn; ssl_certificate /home/www/calendar/SSL/app/Nginx/1_app.calendar.dev.tea-break.cn_bundle.crt; ssl_certificate_key /home/www/calendar/SSL/app/Nginx/2_app.calendar.dev.tea-break.cn.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { root /home/www/calendar/app/build; index index.html index.htm; try_files $uri /index.html autoindex on; } location /api { proxy_pass http://127.0.0.1:8004; } location /uauth { proxy_pass http://127.0.0.1:9000; } location /api/get_cos_credential { proxy_pass https://www.tea-break.cn; } location /T67xT93qKR.txt { root /; expires -1; add_header Cache-Control no-store; } } server { listen 80; server_name app.calendar.dev.tea-break.cn; return 301 https://$host$request_uri; }