简约而不简单的Python Django学习教程~
解疑第一问
NO.1 -> 学起来费力!要学的东西一堆,像无头苍蝇一样?
这是不是你学Django时的状态?
理解不了Django,实在不知道在说什么!
要学的东西太多了,不知道自己该干什么?
学习Django觉得难很重要的一个原因在于基础知识储备不够;
如果你连HTML/CSS的基本语法都不清楚,甚至连Python面向对象的编程、类,对象,类方法和装饰器这些都没弄清楚,学Django的难度可想而知。
学Django前,建议先学习以下基础知识:
Python基础,尤其字符串的处理,正则表达式,函数和类
HTML和CSS语言 - 可以先做个静态网页试试
Javascript和MySQL - 不用成为专家,但至少要了解
先把Python的学习先顺清楚吧,尽量分阶段学,比如基础-进阶-高级的顺序;
语言基础
Python3入门,数据类型,字符串
判断/循环语句,函数,命名空间,作用域
类与对象,继承,多态
tkinter界面编程
文件与异常,数据处理简介
Pygame实战飞机大战,2048
进阶高级
Python常见第三方库与网络编程
Python正则表达式
邮箱爬虫,文件遍历,金融数据爬虫,多线程爬虫
Python线程、进程
Python MySQL数据库,协程,jython
如果你的Python基础不过关,暂时还不能自己写面向对象、装饰器,就先不要接触Django。
总之前端是要学一点的,前端三板斧html、css、javascript的基础少不了。
建议Python掌握的差不多的时候再去补前端的基础,了解一些http协议、html、css的知识,达到读懂修改的水平就差不多了。
javascript的话多懂一点肯定有好处,之后再去学django可能就没那么云里雾里的。
另外最好能够掌握linux系统的基本运用,熟悉常用的操作命令,数据库的话至少应该具备独立安装配置mysql数据库、和基础的SQL语法常识。
解疑第二问
NO.2 -> 去找工作的话需要掌握一些什么技能?
其实这个问题的跟前面讲到的技能基础差不多,例如:
python网络框架的熟练掌握,如django、tornado等至少一到两个框架;
了解Linux下的服务器级应用程序,熟悉日常开发;
具备基础的前端代码设计能力
熟悉HTTP协议,了解RESTful
熟悉异步编程,掌握twisted框架加分等等;
总得来说,计算机的底层技术原理、数据结构和算法、操作系统、网络原理、设计模式等这些是必备的,面试考来考去也无非就是这些基础的东西问的最多。
比如面前端这块问的比较多的,像网络原理的知识、JavaScript、数据结构和算法。Python Web开发的Python基本数据结构、Python面向对象和装饰器、计算机网络原理和数据结构等等。
总之就是重视基础,多项目实践,多看看前辈的面经,学习一下经验,算法的话多刷刷题。
LeetCode、牛客网、AlgoMooc都是不错的算法刷题网站,算法书籍的话可以去看看《剑指offer》。
这本书剖析了50个典型的程序员面试题,从基础知识、代码质量、解题思路、优化效率和综合能力五个方面系统整理了影响面试的5个要点,是面试必读书籍之一。
下面是django面试常见的一些问题,偏向基础;
1 列举Http请求中常见的请求方式
2 谈谈你对HTTP协议的认识。1.1 长连接
3 简述MVC模式和MVT模式
4 简述Django请求生命周期
5 简述什么是FBV和CBV
6 谈一谈你对ORM的理解
7 rest_framework 认证组件的流程
8 什么是中间件并简述其作用
9 django 中间件生命周期
10 django中怎么写原生SQL
11 如何使用django orm批量创建数据
12 命令migrate 和makemigrations的差别
14 常用视图响应的方式是什么?
15 HTTP响应常见状态码分类
16 路由匹配原则是什么?
17 缓存系统类型有哪些
18 解决跨域的常用方式是什么?
19 信号的作用是什么?
20 Django的Model的继承有几种形式,分别是什么
21 Django中查询queryset时什么情况下用Q
22 Django中想验证表单提交是否格式正确需要用到Form中的哪个函数
23 orm如何取消级联
24 Django中如何读取和保存session,整个session的运行机制是什么
25 简述Django对http请求的执行流程
25 Django中当用户登录到A服务器进入登陆状态,下次被nginx代理到B服务器会出现什么影响
26 跨域请求Django是如何处理的
27 查询集的两大特性?什么是惰性执行
28 查询集返回的列表过滤器有哪些
29 如何获取django urlpatterns里面注册的所有url?
30 django路由系统中include是干嘛用的?
31 django2.0中的path与django1.xx里面的url有什么区别?
32 urlpatterns中的name与namespace有什么作用?你是如何使用的?
34 如何给一个字段设置一个主键?
35 如何设置一个带有枚举值的字典?
36 DateTimeField类型中的auto_now与auto_now_add有什么区别
37 values()与values_list()有什么区别?
38 selected_related与prefetch_related有什么区别?
39 当删除一个外键的时候,如何把与其关联的对应关系删除
40 class Meta中的元信息字段有哪些
41 多对多关联的表,如何插入数据?如何删除数据?如何更新数据?
42 django的M2M关系,如何手动生成第三张表?
43 在Django中,服务端给客户端响应信息有几种方式?分别是什么?
44 在视图函数中,常用的验证装饰器有哪些?
45 如何给一个视图函数加上缓存?
46 web框架的本质是什么?
47 创建Django工程、Django app、以及运行的命令
48 django中csrf的实现机制
49 Django App的目录结构
50 Django 获取用户前端请求数据的几种方式
51 描述下 自定义simple_tag
52 什么是Cookie、如何获取、设置Cookie
53 什么是session,与cookie的对比、设置、获取、清空session
54 什么是CSRF,及防范方式
55 get请求和post请求的区别
56 图书管理系统的表结构是怎么设计的?
57 WSGI / uwsgi/ uWSGI区分
59 解释blank和null
60 QueryDict和dict区别
61 谈谈你对restful规范的认识?
62 Django 本身提供了 runserver,为什么不能用来部署?
63 Tornado 的核是什么?
64 Django重定向你是如何实现的?用的什么状态码?
65 Django中如何加载初始化数据
66 简述Django下的(内建)缓存机制
简述django请求的生命周期?
(1)用户输入网址,浏览器发起请求
(2)WSGI(服务器网关接口)创建socket服务端,接受请求
(3)中间件处理请求
(4)url路由,根据当前请求的url找到相应的视图函数
(5)进入view,进行业务处理,执行类或者函数,返回字符串
(6)再次通过中间件处理相应
(7)WSGI返回响应
(8)浏览器渲染
HTTP响应常见状态码分类
状态码如200 OK,以3位数字和原因组成,数字中的第一位指定了响应类别,后两位无分别,响应分别有以下5种:
常见的状态码
Django重定向你是如何实现的?用的什么状态码?
1)使用HttpResponseRedirect:
from django.http import HttpResponseRedirect
2)使用redirect和reverse
状态码:301和302
-> 301和302的区别:
不同点:
1)301比较常用的场景是使用域名跳转
2)302用来做临时跳转
django中csrf的实现机制?
1)django第一次响应来自某客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中,同时,后端把这个token放到cookie中交给前端页面;
2)下次前端需要发起请求的时候把这个token值加入到请求数据或者头信息中,一起传给后端。
3)后端校验前端请求带过来的token和SESSION里的token是否一致
简述MVC模式和MVT模式的理解?
1)MVC
所谓MVC就是把Web应用分为模型(M),控制器©和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起。
模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求。
M:Model,模型,和数据库进行交互
V:View,视图,负责产生 Html 页面
C:Controller,控制器,接收请求,进行处理,与 M 和 V 进行交互,返回应答。
2)MTV
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
M 代表模型(Model):负责业务对象和数据库的关系映射(ORM)。
T 代表模板 (Template):负责如何把页面展示给用户(html)。
V 代表视图(View):负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template。
MTV的响应模式如下所示:
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数。
(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户)。
视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
nginx 和 uWISG 服务器之间如何配合工作的?
首先浏览器发起 http 请求到 nginx 服务,Nginx 根据接收到请求包,进行 url 分析,判断访问的资源类型。
如果是静态资源,直接读取静态资源返回给浏览,如果请求的是动态资源就转交给 uwsgi 服务器,uwsgi 服务器根据自身的 uwsgi 和 WSGI 协议,找到对应的 Django 框架。
Django 框架下的应用进行逻辑处理后,将返回值发送到 uwsgi 服务器,然后 uwsgi 服务器再返回给 nginx,最后 nginx 将返回值返回给浏览器进行渲染显示给用户。
django 如何提升性能(高并发)?
对一个后端开发程序员来说,提升性能指标主要有两个一个是并发数,另一个是响应时间网站性能的优化一般包括 web 前端性能优化,应用服务器性能优化,存储服务器优化。
对前端的优化主要有:
(1)减少 http 请求,减少数据库的访问量,比如使用雪碧图。
(2)使用浏览器缓存,将一些常用的 css,js,logo 图标,这些静态资源缓存到本地浏览器,通过设置 http 头中的 cache-control 和 expires 的属性,可设定浏览器缓存,缓存时间可以自定义。
(3)对 html,css,javascript 文件进行压缩,减少网络的通信量。
什么是 restful api?谈谈你的理解
REST
Representational State Transfer 的缩写,翻译:“具象状态传输”。一般解释为“表现层状态转换”。
REST 是设计风格而不是标准,是指客户端和服务器的交互形式,我们需要关注的重点是如何设计。
REST 的特点:
(1)具象的
一般指表现层,要表现的对象就是资源。比如客户端访问服务器、获取的数据就是资源文字、图片、音视频等。
(2)表现
资源的表现形式:txt 格式、html 格式、json 格式、jpg 格式等;
浏览器通过 URL 确定资源的位置,但是需要在 HTTP 请求头中,用 Accept 和 Content-Type 字段指定,这两个字段是对资源表现的描述。
(3)状态转换
客户端和服务器交互的过程;在这个过程中,一定会有数据和状态的转化,这种转化叫做状态转换。
其中,GET 表示获取资源,POST 表示新建资源,PUT 表示更新资源,DELETE 表示删除资源,HTTP 协议中最常用的就是这四种操作方式。
RESTful 架构:
每个 URL 代表一种资源;
客户端和服务器之间,传递这种资源的某种表现层;
客户端通过四个 http 动词,对服务器资源进行操作,实现表现层状态转换。
如果你已经能独自用Django开发一个比较专业的博客(含登录注册,用户关注,点赞,内容推荐和权限管理);
以及基本的电子商务网站(使用Memcached和Redis,包含购物车和使用支付宝支付接口完成在线支付);
还能熟练地利用DRF开发Web API,并且非常了解django项目的部署和配置,基本上就没有什么大问题了。
解疑第三问
NO.3 -> 实际工作中,python工程师到底是做哪一块的?
Python涉及的领域非常广泛,除了极少的开发之外,基本上可以说全能。
在处理方面包括系统运维、图形处理、数学处理、文本处理;
在编程方面包括数据库编程、网络编程、web编程;
在应用方面包括多媒体应用、pymo引擎、爬虫编写、机器学习、人工智能等等;
Python岗位以后端开发和架构为主,以算法和数据挖掘为辅,并有少量前端、全栈开发岗,以及运维等。
后端开发岗位是大户,是目前所有Python岗位里面需求量最大近一半,需求数量是爬虫工程师的10倍。
其次是数据分析岗位,仅次于Python后端开发;
数据挖掘和机器学习非常类似,可以合算在一起,大概有17%的份额,但是也仅仅是数据分析岗位的一半,看来AI岗位远没有饱和!
爬虫的岗位非常少,看了爬虫岗位需求已经逐渐的降下来,所以想转行从事爬虫的需要考虑一下。
-> Python工程师工作内容(简单归纳)
主要进行与业务相关的数据分析和数据挖掘工作;
主要对日常数据进行提取和报表的开发工作;
主要进行数据平台的设计,研发与维护;
主要参与跨部门需求沟通和数据校验;
-> Python工程师需要的条件(概要)
掌握Python的基本语法,掌握MySQL的基本用法,掌握Linux的常用命令;
掌握web前端技术和web后端框架;
掌握数据爬虫、数据处理、建立模型、设计动态网页;
高级的Python工程师不仅要具备各种语言与数据库基础,还得有项目经验。
-> 以Python后端开发和全栈开发为例:
① Python后端开发
编程语言:具备2年以上开发经验,至少熟悉一种开发语言:Python、Java、PHP、C/C++。
服务框架:熟悉常见的Python框架,熟练掌握Django、Tornado、Flask等其中的一种。
数据库:熟悉常见的数据库,至少熟练掌握Mysql,Mongodb,Redis其中一种,熟悉大规模数据存储及分析系统优先。
熟悉Unix/Linux操作系统,有良好的编码规范。
对web后端技术架构有全面理解,熟悉 TensorFlow 等机器学习框架,是加分项。
② Python前端开发/全栈开发
熟悉Python、Java、PHP、C#、Shell等语言中的至少2门,熟悉Linux操作系统。
与大部分前端的招聘需求类似:HTML5 / CSS3 / JavaScript 基础扎实,精通 ES6 / jQuerydejs 等,熟悉前端框架(Vue/ Angular /React)和原理。
熟练掌握 webpack /gulp /rollup 等构建工具,有丰富的前端工程化实践经验。
掌握Tornado/ OpenERP / Django / Flask者加分。
熟悉 MySQL、PostgreSQL 等数据库,能编写调试 SQL 语句、存储过程,索引、性能优化者,是重要加分项。
其实各应用场景需要的知识结构有不少重叠之处,需要Python 工程师根据自己的职业规划,有意识地构建知识体系和技能树。
END
最后:
欢迎关注「Python新手快速入门」
每天5分钟,学习一个Python小Tip!助力你成为更优秀的Python学习者~