货来了,浓缩了我学习python的所有学习经历,从中获取到的经验分享给你,如果你看了没用,那让我打你一拳。
高中的我,考了三次高考才勉强考上一个二本大学一本数学专业,你没听错,三次;就像俞敏洪和马云一样,我也算和两位大佬有共同点了。
由于这段经历,在大学几年时间,都还时常梦见自己又回到高中,经历高六,然后直接半夜被吓醒大一的时候,学习过一个学期的c语言,我相信大部分人都学过,期末考试过后就基本没有再用过。大二参加过数学建模竞赛,得过一些小奖,但基本没什么卵用。参加过数学建模竞赛的小伙伴应该都知道,主流使用SPSS、lingo等傻瓜式软件,对编程基本没屌用,matlab好一点,但是由于matlab封装性很高,并且价格不菲,也就渐渐放弃了
到大三开始,基本就属于混的阶段,每天与床伴平行,经常旷课,没事就打游戏、泡妞、唱k、打望、反正没务过正业。
那段时间还沉迷于王者农药,超级喜欢玩李白,还贼菜那种。
我的英语四级连续考了7次,最高分403分。菜到这种程度,我自己都怀疑自己智商是不是有问题。这种英语水平做一个程序员都困难,很多资料、外国论坛事看不懂的。
虽然程序员不需要多高的英语水平,但是,好的英语阅读能力会真的会大大开阔你的眼界,提高你的职业上限,这也是我工作了一年后才渐渐明白的,悔啊!!!要是我能回到大一,一定会对那个无知的SB一巴掌,然后告诫他,"一定要好好学英语"。不过在这几年大学日子,我到还没有挂过科,唯一挂的就是入学考试,对,就是那个一进校门就要背的规章制度,我真的是哔了哈士奇了。
由于我喜欢数学,数学基础不差,很多数学课程随便学两下,就算一学期没上过几次课,考试都是高分通过。
哈哈,这也是我大学唯一值得自豪的事了,证明我还不是一无是处,完完全全混吃等死。这样浑浑噩噩过了一年多,到了大四上半年,班上成绩好的同学,保研的保研,考研的也考完了,就在等着好消息。
而我呢,其实也参加了考研,但是,最后一门考试快结束的时候,我的耳边响起了一首《凉凉》的钟声。直到毕业,我都没看一眼考研成绩。
大概在毕业那一年的四月份初,我找到了一份实习工作,公司很小,一共就10个人左右,主要基于android做游戏开发。
那个老板人特别好,对我也是非常有耐心,手把手教我计算机的知识。尽管像他这么有耐心的老板,依然被我的蠢折服了,他给我说命令行,我一脸呆萌的问,命令行是啥东西;还有,我连windows的文件结构,文件目录都搞不太清楚。
实习期间,我并没有做有关游戏的工作,而是学习python、学习机器学习的有关理论。主要原因是老板要求我学这个,他也想蹭蹭AI的热度,想转行做人工智能相关的东西。尽管当他给我说深度学习的时候,我连这是个什么鬼都不知道。
在那里我待了一个半月的时间,完全自学了python基础、tensorflow、自学了机器学习的一些理论,手推了反向传播、支持向量机、决策树、卷积神经网络等算法。也在github上找了一些开源项目,学习一下别人的代码。
五月中旬我回到学校写毕业论文,也就那样,网上抄些东西修修改改,剩下的就是浪了。直到7月初毕业答辩结束,滚出了学校。
我是一直想到一线城市去的,没办法,由于学编程没多久,学得不精,也没能力、更没有勇气义无反顾的走出去。要知道,向我这种普通大学的数学本科毕业是很尴尬的,当老师吧,只能去农村,去企业吧,只会些理论知识,啥都干不了;去考公务员吧,我又不喜欢那种一眼能望到头的生活。没办法,只能回到我实习的公司。
在公司待了十多天时间,每天都在想着怎样去广州,去那边找一份工作,但是对未来的恐惧让我迟迟不敢行动。直到7月23号上午,我发小来了一个电话:
发小:问你个事,我室友要辞职了,没人跟我一起合租,你要不要来?
我:嗯。。。。。。 我考虑一下,明天给你答复
发小:要得,你想好了给我说
当天,我的心情异常激动,但又极度担忧。但我知道,这样拖下去,我就永远待在这里了。
下午我编了一份简历,对,就是编的,然后就在前程无忧上投了大概有一百多份,反正广撒网嘛。没想到,陆陆续续就有好几家公司给我打电话,叫我去广州面试。这一下,我有了底气,心里想着,好几个面试,也许会有一个中吧。第二天上午就给我发小打电话说我马上来广州,下午就给老板辞职了。辞职后,回家待了一天,然后就坐飞机飞到了广州。
到广州,我面试了大约有8家公司,没有人要,我记得有一个hr语重心长的给我说了这样一句话:“你的基础不太好,但是你还年轻,还有很多时间去学习,报个培训班、考个在职研究生也可以,加油,小伙子”
当时心都凉了大半截,不过,这个hr给我的鼓励让我至今都记得这句话,不过,我没接受他的建议去报一个培训班,依然不停的投简历,面试。终于,找到了一家公司。面试过程大致是这样的:
刚到公司,hr给我了一套面试题,我记得一共有20多道题,而我,只做了两道选择题,还是那种逻辑稍微复杂点的if判断题。时间到了,hr看了我的试卷,没说啥,就开始问我的经历我讲了数学建模的经历,实习的经历,虽然我的编程能力不高,但数学基础还算不错,和hr聊的还比较愉快。然后,hr最后给我说了这样一句话:
“你这个试卷不能给人事看到,看到肯定就没戏了”
他把我试卷大卸八块后扔进了垃圾桶。就这样,我进了现在的公司,做有关机器学习的项目,比如人脸识别、智能客服、语音识别等。至今已经一年多了。
目前我依然在这个公司,可能今年就会辞职了。从去年九月份开始,我经营自己的公众号,不到半年时间公号关注量破万破万,知乎关注量破万,头条关注刚刚入驻,一天时间关注量破千,成为了一个自媒体小作者,写写文章,偶尔接点小广告赚点零花钱,虽然不多,但已经非常开心了。
上面说了一大堆,看似和问题无关,其实是有很大的关系:
1、如果你是非科班毕业想要转行编程,看了我的经历你一定很有信心与动力,高考三次、常年逃课、混吃等死的我都能,你一样能。
2、如果你完全零基础,又不想去培训,怕被割韭菜,那你可以参考一下我的经历。
3、如果你本身有一些数据结构、数学理论、或编程语言的基础,你想学好编程,那你更应该有自信,因为你已经和那些非科班的人不在一个起跑线了,你只需要不断地努力,坚持坚持再坚持,就行了。
4、面试的时候,技术不一定需要非常非常好,特别是刚毕业的大学生,你只要有闪光点,能让hr感受到,那还是很有希望的。
现在是真正的干货开始了我实习的时候,python完全零基础,我看的第一个入门资料是一个视频教程,我觉得非常不错,分享给大家
Python教程_600集Python从入门到精通教程
网址:https://www.bilibili.com/video/av14184325from=search&seid=12319528533837151178
我开始学python的时候,看过很多入门书籍,比如《菜鸟教程》、《本办法学python》、《python编程从入门到实践》,但是没有一本是真正看完了的,基本都只看了五分之一不到。为什么呢,主要有两点
1、里面的有些东西讲的并不基础,比如我从来没学过类,看到类那一章完全处于懵逼状态,于是放弃了
2、一本书太多了,如果哪个时候你忙其他事忘了,回头来学发现,前面的忘得差不多了
所以,看这类型python编程书对新手不太友好,尽管它说是入门书籍。
这个视频一共六百集,别看这么多,其实花不了多少时间,每一集也就5、6分钟,很容易坚持看下去,就算你吃饭、排队付钱、等公交、甚至拉个屎都能看一集。这样一集一集,不断形成正向反馈,你学的越来越有自信,越有自信越想学,你想想这是多么快乐的事情。并且这个老师讲课风格很幽默,听着会很轻松、也很基础。
一次性别看太多,一次看两三集,每天多看几次,定期上机练手就行了。相信我,我是这样从零做到的,你也一定行。还有一点必须说明,这个视频的前两百集是linux基础,你有兴趣可以学,也可以不学,如果是完全的新手,建议你别看,并不影响后面的学习。
关于搜索引擎
真的,放弃百度吧,赶快用google,我遇到过太多次百度上找出一堆无关紧要的废话答案,而在google第一个答案就是我想要的情况。好的搜索引擎,会大大提升你学习的效率,尤其是作为一个程序员。
百度这种东西,只适合拿来搜索八卦新闻,不适合搜索学术、知识。
当然拉,知乎也是一个找优质资源的途径,比如你现在看到我的回答。
这里我再推荐一下其他的视频资料,也是非常好的,可以搭配看
1、[小甲鱼]零基础入门学习Python
网址:https://www.bilibili.com/video/av4050443?from=search&seid=3592529169870904984
2、【python教程】数据分析——numpy、pandas、matplotlib
网址:https://www.bilibili.com/video/av57023791?from=search&seid=3592529169870904984
还要着重提醒一下大家,学到一定阶段过后,一定要注意看官方文档,百度搜到的很多知识真的很垃圾,这种时候在百度上花费太多时间简直是暴殄天物,贴上官方文档地址:
https://www.python.org/
官方文档永远是你最坚实的后盾,这上面包含了python的一切
如果你不喜欢看视频,这里有一些高质量的文档分享给你:
Vamei老师:【python快速教程】 https://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html
廖雪峰老师:【python教程】https://www.liaoxuefeng.com/wiki/897692888725344
《笨办法学 Python》:这本书绝对是最简单的学习 Python 的方法,本书的 HTML 在线版是完全免费的。http://learnpythonthehardway.org/book/
Python Weekly:每周更新,包括Python相关的文章、教程、演讲、书籍、项目、工作等。http://www.pythonweekly.com/
Python challenge:用Python编程技能解决33个谜题,闯关。http://www.pythonchallenge.com/
编程零基础应当如何开始学习 Python ? - 知乎 https://www.zhihu.com/question/20039623
Python 初学者的最佳学习资源 - Python - 伯乐在线 http://python.jobbole.com/82399/
如果你已经学完了基础,需要在特定的方向上有所提高,比如web、爬虫,那我有一些资源给你:
web项目练习
web机器人:
Python搭建的web接口聊天机器人-CSDN下载?download.csdn.net
https://download.csdn.net/download/tobacco5648/9417643
web实战:
https://github.com/michaelliao/awesome-python-webapp
博客BBS论坛系统:
Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点 - Mr.心弦 - 博客园?https://www.cnblogs.com/luotianshuai/p/5331982.html
成绩管理系统:
一个使用django开发的综合成绩管理系统 - 开源中国社区
https://link.zhihu.com/?target=https%3A//www.oschina.net/code/snippet_209440_19482
新闻系统:
python项目练习四:新闻聚合 | the5fire的技术博客?
https://www.the5fire.com/python-pro4-newsagent.html
爬虫项目练习
爬取知乎:
http://zhihu-py3.readthedocs.io/zh_CN/latest/
爬取豆瓣:
https://github.com/fanpei91/doubanspiders
爬取京东:
https://github.com/Adyzng/jd-autobuy
爬取新浪微博:
https://github.com/dataabc/weiboSpider
爬取微信:
https://github.com/CoolWell/wechat_spider
如果你在特定方向学习的过程中,发现你的python基础不牢固,需要进一步学习python,我推荐你看这本书:
https://python3-cookbook.readthedocs.io/zh_CN/latest/c01/p13_sort_list_of_dicts_by_key.html
毫不夸张的说,这是我看到的有关python进阶最好的书了,名字叫python-cookbook,简直良心作品。没有之一。上面的所有代码复制就能运行,非常方便调试。
如果你看了我的推荐还是不满足,那我这里我推荐一些其他好的博主:
Python 有哪些好的学习资料或者博客?? https://www.zhihu.com/question/34907211
你可以去看看这个答案,有比较详细的介绍。
我这里再推荐一个我非常喜欢的一个博主,文章都非常精辟:
http://blog.konghy.cn/2016/06/23/python3-new-feature/
python其实真的很好学习,入门也很简单,刻苦一点,花一周时间,就算你完全是编程小白,入门也是完全没问题的。你看看我,非科班,没有经过任何培训,高考考三次才勉强上一本的人,都能学会,你也一定能。
但是,python想要学好真的不容易,需要你花大量的时间,刻苦专研,才能游刃有余
“苦心人,天不负,卧薪尝胆,三千越甲可吞吴”
与诸君共勉
程目录
当前网上优秀的Python入门类教程、网课数不胜数。我并不擅长写入门教程,凑个热闹,仅以我个人入门Python的学习过程为线索,为大家推荐各个阶段、知识点的优秀教程。
首先推荐几份优秀的入门教程:
https://www.liaoxuefeng.com/wiki/1016959663602400 廖雪峰的教程
https://docs.python.org/zh-cn/3/tutorial/ Python官方文档提供的教程(虽然不太适合入门,但是非常适合当百科全书用)
https://www.runoob.com/python3/python3-tutorial.html 菜鸟教程的Python3教程
http://c.biancheng.net/python/base/ C语言中文网的教程
下面是我个人学Python的过程总结及推荐教程。其中学习目标为该过程推荐理解、实现的内容;扩展知识为该学习阶段涉及的更复杂应用,不需要在当前阶段理解、实现。
在学习一门编程语言之前,我们首先要了解它是什么,我们为什么要学它而不是学习其他的编程语言。虽然这个在短期内对学习没什么影响,但是长期来看对学习还是挺有指导意义的,另外遇到程序猿也可以多点话题。
廖雪峰Python教程:Python简介
https://www.liaoxuefeng.com/wiki/1016959663602400/1016959735620448
Python官方文档:课前甜点
https://docs.python.org/zh-cn/3/tutorial/appetite.html
根据我之前的“教学”体验,编程语言的环境搭建大多都对初学者并不友好,出现一些特殊异常有可能直接劝退。所以个人推荐在学习最初先不必搭建环境,可以先用线上编辑器学习(在学习第三方模块前都可以先用线上编辑器)。
Python在线编辑器:好用的Python在线编辑器推荐
Python环境搭建:Python+Pip开发环境安装
首先,我们理解一些最基本的东西,包括如下内容:输入和输出、变量、数据类型、运算符。如果有其他编程语言的基础,其实只需要了解一下输入和输出的函数即可。
在学习的过程中,您可以尝试实现以下练习:
(1)输入和输出
学习目标:实现在控制台输出“Hello World”
廖雪峰Python教程:输入和输出
https://www.liaoxuefeng.com/wiki/1016959663602400/1017032074151456
扩展知识:
print()函数的详细用法
CSDN-TCatTime的博客:Python print()函数
https://blog.csdn.net/TCatTime/article/details/83450692
菜鸟教程:输入和输出(输出格式美化)
https://www.runoob.com/python3/python3-inputoutput.html
(2)交互模式/命令行模式
学习目标:理解Python的命令行模式和交互模式之间的区别,了解两个模式的启动方法
博客园大鱼biubiu博客:命令行模式和python交互模式
https://www.cnblogs.com/zhanym/p/9984571.html
(3)变量及数据类型
学习目标:
廖雪峰Python教程:数据类型和变量
https://www.liaoxuefeng.com/wiki/1016959663602400/1017063826246112
扩展知识:
①字符串变量的详细用法(建议在学习运算符后学习)
菜鸟教程:字符串
https://www.runoob.com/python3/python3-string.html
②数字变量的详细用法(建议在学习运算符后学习)
菜鸟教程:数字(Number)
https://www.runoob.com/python3/python3-number.html
(4)运算符
学习目标:理解算术运算符、比较运算符、赋值运算符、逻辑运算符、成员运算符、身份运算符以及运算符优先级顺序
菜鸟教程:运算符
https://www.runoob.com/python3/python3-basic-operators.html#ysf6
各个运算符的详细用法可以参见以下教程(逻辑运算符建议在学习条件判断之后学习):
C语言中文网:Python算术运算符
http://c.biancheng.net/view/2183.html
C语言中文网:Python赋值运算符
http://c.biancheng.net/view/2182.html
C语言中文网:Python比较运算符
http://c.biancheng.net/view/4258.html
C语言中文网:Python逻辑运算符
http://c.biancheng.net/view/2186.html
(5)列表 list / 元组 tuple / 集合 set / 字典 dict
学习目标:列表、元组、集合、字典的定义、访问、修改、删除方法以及运算符;了解其函数和方法(建议在学习函数之后学习);了解其截取和拼接(建议在学习切片器之后学习)
菜鸟教程:列表
https://www.runoob.com/python3/python3-list.html
菜鸟教程:元组
https://www.runoob.com/python3/python3-tuple.html
菜鸟教程:集合
https://www.runoob.com/python3/python3-set.html
菜鸟教程:字典
https://www.runoob.com/python3/python3-dictionary.html
接下来,我们需要了解控制程序基本运行流程的方法(就是把高中学的程序框图在Python中实现出来),主要包括条件判断和循环。
在学习的过程中,您可以尝试实现以下两个练习:
首先推荐完整讲述程序流程的教程:
Python官方文档:其他流程控制工具(4.1-4.5)
https://docs.python.org/zh-cn/3/tutorial/controlflow.html
(1)条件判断
学习目标:掌握条件判断语句写法,建议实现推荐教程中BMI计算的练习
廖雪峰Python教程:条件判断
https://www.liaoxuefeng.com/wiki/1016959663602400/1017099478626848
(2)循环
学习目标:掌握if和while的使用方法,了解break、continue和else子句
菜鸟教程:循环语句
https://www.runoob.com/python3/python3-loop.html
练习的实现代码
菜鸟教程:获取 100 以内的质数(方法一)
https://www.runoob.com/python/python-get-prime-number.html
CSDN-chenlunju的博客:python求斐波那契数列中第n个数的值(方法一)
https://blog.csdn.net/chenlunju/article/details/85603662
在掌握了基本语法和基本程序流程后,其实已经基本上可以实现出大部分想要实现的内容了,但是此时的程序会包含很多重复;而函数就是用来精简程序,提高程序可读性的有效方法。在这个阶段,我们需要掌握定义函数、调用函数、函数参数,并对递归函数的使用方法略作了解。
在学习的过程中,您可以尝试实现以下练习:
(1)什么是函数?
首先,我们需要理解什么是函数,函数是用来干什么的。在理解计算机函数时,可以借助数学函数和Excel的函数来辅助理解。
百度知道:什么是计算机函数?(第二个回答)
https://zhidao.baidu.com/question/168286141.html
廖雪峰Python教程:函数
https://www.liaoxuefeng.com/wiki/1016959663602400/1017105145133280
(2)定义、调用函数
学习目标:熟练掌握调用Python内置函数、定义函数并调用定义的函数的方法
①调用Python内置的函数
廖雪峰Python教程:调用函数
https://www.liaoxuefeng.com/wiki/1016959663602400/1017105451316128
②定义并调用定义的函数
廖雪峰Python教程:定义函数
https://www.liaoxuefeng.com/wiki/1016959663602400/1017106984190464
Python官方文档:定义函数(4.6)
https://docs.python.org/zh-cn/3/tutorial/controlflow.html#defining-functions
(3)函数的参数
学习目标:掌握函数的普通参数(位置参数)、默认参数(a=None)、可变参数(*)、关键词参数(**)的用法,了解强制位置参数(/)的用法
廖雪峰Python教程:函数的参数
https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888
(4)递归函数
学习目标:简单了解递归函数的用法
廖雪峰Python教程:递归函数
https://www.liaoxuefeng.com/wiki/1016959663602400/1017268131039072
5.高级特性
以下高级特性除切片器以外,在现阶段只需要大致了解即可,只要在用的时候能够想起可能有一种更优解即可。这里我选择了几个我在刚入门时比较常用的特性(可以和我应用场景相关),推荐了相关教程。建议大家学习一下廖雪峰的Python教程中对于高级特性的讲解,包括高级特性和函数式编程(函数高级特性)两个部分。
(1)切片器
廖雪峰Python教程:切片器
https://www.liaoxuefeng.com/wiki/1016959663602400/1017269965565856
(2)装饰器
博客园-菩提树下的杨过的博客:python:函数的高级特性(三、装饰器)
https://www.cnblogs.com/yjmyzz/p/advanced-feature-of-python-function.html
(3)迭代
廖雪峰Python教程:迭代
https://www.liaoxuefeng.com/wiki/1016959663602400/1017316949097888
(4)列表生成式
博客园-上海悠游的博客:列表生成式
https://www.cnblogs.com/yoyoketang/p/9274362.html
(5)偏函数
廖雪峰Python教程:偏函数
https://www.liaoxuefeng.com/wiki/1016959663602400/1017454145929440
博客园-菩提树下的杨过的博客:python:函数的高级特性(四、偏函数)
https://www.cnblogs.com/yjmyzz/p/advanced-feature-of-python-function.html
6.模块
熟悉了函数和高级特性之后,基本上就已经掌握了语言的基础,可以实现一些小功能了。但是,很多功能我们仍然无法实现,或者实现起来非常麻烦,例如读写文件、读取系统时间等等,这时候我们就需要引入Python的内置模块和一些第三方模块了。同样,当我们的程序代码越写越多的时候,我们也需要将我们的代码整理到不同的.py文件中,使用模块维护。
在学习的过程中,您可以尝试实现以下练习:
(1)定义及调用模块
菜鸟教程:模块(“深入模块”之前的部分)
https://www.runoob.com/python3/python3-module.html
(2)安装第三方模块
Python官方模块下载地址
https://pypi.python.org/pypi
阿里云镜像Python模块下载地址(在里面直接Crtl+F搜索模块名即可)
http://mirrors.aliyun.com/pypi/simple/
安装第三方模块大概分为如下过程:尝试直接用pip安装import导入的模块名;如果安装失败,百度模块名,看看是不是模块名错误或者存在其他错误;如果仍然安装失败,自行下载适合自己的安装包版本,本地安装。如果本地有多个Python环境,注意模块包安装在了哪个Python环境下。
①pip安装
博客园-miaoning的博客:python如何安装第三方模块(方法一)
https://www.cnblogs.com/miaoning/p/10910972.html
②自行下载模块包安装
博客园-枫子的博客:安装Python第三方模块
https://www.cnblogs.com/fengzzi/p/10040669.html
(3)常用模块
Python标准库
https://docs.python.org/zh-cn/3/library/index.html
Python官方文档模块文档地址
https://docs.python.org/zh-cn/3/library/{模块名}.html
以下常用模块不需要了解它们所有的具体功能,但需要知道一些常用功能可以通过什么模块实现,在使用时再具体学习对应模块的用法。
7.面对对象
因为我个人在学Python前主要是用Java,而Java是完全面对对象的语言,所以我在学Python的过程中没有理解对象的过程。我只能推荐几份教程,但是否适合于初学者理解对象并不能确定。
廖雪峰Python教程:面对对象编程
https://www.liaoxuefeng.com/wiki/1016959663602400/1017495723838528
菜鸟教程:面对对象
https://www.runoob.com/python3/python3-class.html
作者:长行 (Python系列教程:A001)
- 最近因工作需要学习python
- 学习资料:
- 菜鸟Python3教程https://www.runoob.com/python3/python3-tutorial.html
- 廖雪峰Python博客https://www.liaoxuefeng.com/wiki/1016959663602400/
- 以菜鸟为主,廖雪峰补充
- 学习耗时:先花3天左右将菜鸟教程从头到尾过一遍
- 了解基本环境、语法、库
- 了解教程的目录章节结构,知道需要的知识去哪一章查询
- 动手实践:
- 对于有编程经验来说python上手还是非常简单的
- 但技术细节是过眼烟云
- 最好的办法是使用他写一个小系统,持续迭代,后续只需查阅之前用法即可
- 本文的后面部分就是使用Flask框架来搭建、部署一个简单web应用
- 官方文档https://dormousehole.readthedocs.io/en/latest/index.html
- Flask为python语言的轻量级web框架
- Flask vs Django
- Django大而全
- Flask更偏向提供轻量级api服务
# 切换python虚拟环境为pyspark
conda activate pyspark
# 安装Flask
pip install Flask
# 检查Flask版本
>>> import flask
>>> flask.__version__
'2.1.2'
# coding:utf8
'''
本演示代码参考官方文档quickstart:
https://dormousehole.readthedocs.io/en/latest/quickstart.html
'''
from flask import make_response, redirect, session, url_for
from flask import Flask
from flask import render_template
from flask import request
from werkzeug.utils import secure_filename
from flask import abort
import os
app=Flask(__name__)
# 秘钥设置
app.secret_key=os.urandom(16)
@app.route("/")
def index():
# 已登录的返回登陆信息
if 'username' in session:
# return f'Logged in as {session["username"]}'
return f'''
<p>Logged in as {session["username"]}</p>
<form action="logout">
<input type="submit" value="Logout" />
</form>
'''
# 未登录的重定向到登录页
return redirect(url_for('login'))
@app.route("/login", methods=['GET', 'POST'])
def login():
if request.method=='POST':
# 模拟登陆成功设置session
# 然后重定向到index
session['username']=request.form['username']
return redirect(url_for('index'))
else:
# 返回登陆页
return '''
<form method='post'>
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''
@app.route('/logout')
def logout():
# remove the username from the session if it's there
session.pop('username', None)
return redirect(url_for('index'))
# 接口路径参数、查询参数、cookies使用演示
@app.route("/hello/")
@app.route("/hello/<name>")
def hello(name=None):
print('request=', request)
searchWord=request.args.get('key', '')
print('searchWord=', searchWord)
token=request.cookies.get('token', '')
print(f'token={token}')
# return render_template('hello.html', name=name)
rt=render_template('hello.html', name=name)
resp=make_response(rt)
resp.set_cookie('token', 'the_token')
return resp
# 文件上传演示
@app.route("/upload", methods=['GET', 'POST'])
def upload():
file=request.files['file']
# 获取上传文件的源文件名
file.save(f'/home/dev/test/upload/{secure_filename(file.filename)}')
return "success"
# 404页面演示
@app.route("/404", methods=['GET', 'POST'])
def error():
abort(404)
# 404页面设置
@app.errorhandler(404)
def not_found(error):
resp=make_response(render_template('404.html'), 404)
resp.headers['X-Something']='A value'
return resp
# Restful API演示: 返回JSON
@app.route("/me")
def me_api():
return {
"username": "M",
"theme": "theme",
"image": url_for("static", filename="style.css"),
}
if __name__=='__main__':
print('app.run()...')
app.run(port=5000)
pytools/templates/hello.html:
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
pytools/templates/404.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Not Found</title>
</head>
<body>
Page Not Found !
</body>
</html>
pytools/static/style.css
/* 无内容 */
方式一:使用flask运行
# 切换到app.py目录
cd pytools
#设置环境变量FLASK_APP
export FLASK_APP=app #不设置默认为app
#运行
flask run
运行结果:
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
注意: 此种方式不会执行__name__=='__main__'的内容
方式二:使用python运行
# 通过python -m app 或 python app.py
# 切换到app.py目录
cd pytools
#python -m app
python app.py
运行结果:
app.run()...
* Serving Flask app 'app' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:8080 (Press CTRL+C to quit)
通过运行输出日志可见LISTEN PORT为8080
注意: 此种方式会执行__name__=='__main__'的内容
uwsgi官方文档: https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html
# 切换到使用的python虚拟环境(我这里是pyspark)
conda activate pyspark
# 通过pip安装uwsgi
pip install uwsgi
# 报错找不到libpython3.9.a
#=> 是因为python觉得python.xx.a文件大家日常使用较少,所以在新版本中默认不生成python.xx.a文件
# 因此需要编译python源代码来生成libpython3.9.a文件
# 下载python3.9.12版本源代码(我本地anaconda3 python版本为3.9.12)
wget https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tgz
#解压
tar xzvf Python-3.9.12.tgz
#进入源码目录
cd Python-3.9.12
#编译器配置安装目录
./configure --prefix=/tmp/python3.9.12
#注意不要带上--enable-optimizations参数,会导致gcc版本问题
#./configure --prefix=/tmp/python3.9.12 --enable-optimizations
#编译
make
#安装,会安装在之前设置的/tmp/python3.9.12目录
make install
#进入安装目录
cd /tmp/python3.9.12
# 复制libpython3.9.a到指定的目录(pip install uwsgi报错会提示在config-3.9-x86_64-linux-gnu目录找不到libpython3.9.a文件)
cp libpython3.9.a /export/server/anaconda3/envs/pyspark/lib/python3.9/config-3.9-x86_64-linux-gnu/
# 重新执行uwsgi安装
pip install uwsgi
#继续报错: collect2: error: ld returned 1 exit status
#类似问题是gcc或依赖库版本不兼容导致
#查询资料后给出解决办法是使用conda来安装uwsgi
conda install uwsgi
#使用conda安装还是失败,查询资料后还是依赖的库或版本不兼容导致
#给出解决办法是设置conda的channel(类似maven仓库源)
#然后更新conda
#然后重新安装
#conda channel具体可参考https://www.jianshu.com/p/eba58694537b
#设置channel为conda-forge
conda config --add channels conda-forge
#查看当前channels
conda config --get channels
# 安装conda
conda install conda
# 更新conda
conda update conda
# 重新安装uwsgi
conda install uwsgi
安装成功
#查看uwsgi版本
uwsgi --version
2.0.20
#查看uwsgi对应python版本
uwsgi --python-version
3.9.12
pytools/config.ini
#在项目根目录(pytools)创建配置文件config.ini
[uwsgi]
master=true
#python代码热更新
py-autoreload=1
#uwsgi启动时,所使用的地址和端口(这个是http协议的)
http=0.0.0.0:8000
#指向网站目录
chdir=/home/dev/test/pyspark/pytools
#python 启动程序文件
wsgi-file=app.py
#python 程序内用以启动的application 变量名
callable=app
#处理器数
processes=4
#线程数
threads=2
uid=dev
gid=dev
# uwsgi的进程名称前缀
procname-prefix-spaced=etd
# 退出uwsgi是否清理中间文件,包含pid、sock和status文件
vacuum=true
# socket文件,配置nginx时候使用
# socket=%(chdir)/uwsgi/uwsgi.sock
# status文件,可以查看uwsgi的运行状态
#stats=%(chdir)/uwsgi/uwsgi.status
# pid文件,通过该文件可以控制uwsgi的重启和停止
pidfile=%(chdir)/uwsgi/uwsgi.pid
# 日志文件,通过该文件查看uwsgi的日志
daemonize=%(chdir)/uwsgi/uwsgi.log
#进入项目根目录
cd pytools
#创建uwsgi目录
mkdir uwsgi
#启动
uwsgi config.ini
[uWSGI] getting INI configuration from config.ini
#查看进程
ps -ef|grep etd
dev 9388 27859 0 21:05 ? 00:00:02 etd uWSGI worker 1
dev 9389 27859 0 21:05 ? 00:00:02 etd uWSGI worker 2
dev 9392 27859 0 21:05 ? 00:00:02 etd uWSGI worker 3
dev 9393 27859 0 21:05 ? 00:00:02 etd uWSGI worker 4
dev 9394 27859 0 21:05 ? 00:00:00 etd uWSGI http 1
root 20149 11597 0 21:47 pts/5 00:00:00 grep --color=auto etd
dev 27859 1 0 20:14 ? 00:00:11 etd uWSGI master
uwsgi --ini uwsgi.ini # 启动
uwsgi --reload uwsgi.pid # 重启
uwsgi --stop uwsgi.pid # 关闭
#### 访问
浏览器访问 http://ip:8000/返回登录页面
后续就可以在此基础上继续试验python了...
上一张Flask:
*请认真填写需求信息,我们会在24小时内与您取得联系。