标签 Python 下的文章

好记性不如烂笔头系列之Flask紧张跟进(一)


创建虚拟环境

anaconda

conda create --name flask_dev python=<版本号>

Linux:

source activate <虚拟环境名称>

Windows:

activate <虚拟环境名称>

在虚拟环境下安装需要的包

# 在虚拟环境激活的状态命令行下直接
conda install [包名]
# OR
conda install -n <虚拟环境名称> [package]

关闭虚拟环境

# Linux
source deactivate
# Windows
conda deactivate
flask如何兼容url后边带不带“/”
  • flask将不带/的url重定向到了带/的url上来
flask自启动
  • flask内置
app.run(debug=True)

Flask 注册路由

  • 装饰器
@app.route('/hello/')
def hello():
    return 'hello,fmujie'
  • 通过核心对象app来装饰
app.add_url_rule('/hello/', view_func=hello)
#第一个参数为路由,第二个参数为绑定的视图函数

路由的注册都是使用add_url_rule的方式来实现的,只不过flask为了方便大家使用,将add_url_rule封装成为一个装饰器,让大家可以更优雅的实现路由的注册

def route(self, rule, **options):
    def decorator(f):
        endpoint = options.pop('endpoint', None)
        self.add_url_rule(rule, endpoint, f, **options)
        return f
    return decorator

app.run()相关参数

app.run(host='0.0.0.0', debug=True, port=81)
#host='0.0.0.0'开启外网可访问、port自定义端口号

关于debug

  • 推到线上可以通过设置debug=False来关闭调试模式,
  • 部署原则 - 镜像关系(两份源代码相同)启用配置文件

新建config.py文件

DEBUG = True

入口文件载入配置文件(app核心对象提供了一个方法,能够将config.py模块内定义的参数导入进来)

app.config.from_object('config')
# app对象下有一个config属性,该属性下有一个from_object()方法,使用该方法导入配置文件
# 接收的参数为 模块的路径

读取配置文件

app.run(debug=app.config['DEBUG'])
# config为dict的一个子类
# !!!使用该种方法载入配置文件,大小写需注意[大写-flask规定]

生产环境

nginx+uwsgi

  • nginx作为前置服务器,用于转发浏览器的请求给uwsgi
  • uwsgi加载run.py模块启动flask的相关代码

生产环境下当前run.py文件便不是一个入口文件了,只是被uwsgi加载的模块文件,所以说app.run()是根本不会去执行的。

如果没有if __name__ == '__main__':这个判断,在生产环境下一旦加载了run.py这个文件,app.run()就会执行,我们已经有了uwsgi来作为Web服务器,在这种情况下又启用了flask内置的Web服务器,两个服务器是不可以的,如果有if __name__ == '__main__':判断的话,保证了在生产环境下不会启动Flask自带的Web服务器。

响应对象

视图函数的return与普通函数的return有什么区别?

  • 视图函数Flask会在背后做一系列的封装,不仅仅是一个普通函数

视图函数在返回内容之外还会返回各种附加信息

  • status code 响应状态码
  • content-type 放置于httpheaders属性中
@app.route('/hello')
def hello():
    return '<html></html>'

def hell():
    return 'hello,fmujie'

Flask会给视图函数返回的内容,在headers属性中的content-type增添一个值,该值明确的指明了http客户端(接收方如:浏览器)在拿到内容后以什么样的方式去解析。

视图函数返回的内容永远都是以上的文本,但是如何解析这串文本,我们的服务器是需要告诉客户端。默认情况下,如果我们不指定content-type,那么Flask将会把content-type设置为一个默认值content-type = text/html

  • 等等……

    使用Postman查看头信息

Flask会将字符串作为响应的主体内容,同时它会将之前说的信息封装成为一个Response对象,本质上说视图函数返回的永远都是Response对象。

@app.route('/hello/')
def hello():
    headers = {
        'content-type': 'text/plain'
    }
    response = make_response('<html></html>', 404)
    response.headers = headers
    return response

json格式相同,将content-type的值更换为application/json即可

  • Flask比较方便的返回写法
@app.route('/hello/')
def hello():
    headers = {
        'content-type': 'text/plain'
    }
    return '<html></html>', 404, headers
# 实质是一个元组,Flask内部最终还是会将其变成Response对象返回

这样的返回形式是在Flask中使用最多的。


浅尝辄止-Python


关于for循环

#通常我们这样来
for x in range(0, 10):
    print(x, end='|')

关于range()函数,我们应该需要它的基本用法循环外,还应该了解它的其他参数

比如说:

for x in range(0, 10, 2):
    print(x, end='|')
# 0|2|4|6|8|

这里的第一个参数是函数循环的起始位置,之后的第二个参数则为到10,并不是说计数从0到10,而是从0到9。第三个参数我们赋值为2,那么结果便是每隔2偏移量记一次,所以能得出来以0为第一位,2为增量的一个等差数列。

如若我要不想正着显示,我想要倒着显示该咋搞?

for x in range(10, 0, -2):
    print(x, end='|')
# 10|8|6|4|2|

万物皆对象Object

在Python中万物皆对象,我们在平常的时候,难免要对python中的一些东西进行比较判断

那么我们需要知道如何去判别,使用何种运算符进行判断

对象的三个特征

id 、 value 、 type
is     ==      isinstance
# isinstance() 第一个参数传入要检测类型的变量,第二个参数传入基本的数据类型,可以用tuple的形式传入
# int str tuple(不可改变) 值类型 list set dict(可变) 引用类型

lambda表达式、三元表达式

lambda parameter_list: expression
条件为真时返回的结果 if 条件判断 else 条件为假时返回的结果
# 确实与其他语言不大一样 x > y ? x : y

列表推导式

a = [1, 2, 3]
b = [i**3 for i in a]
print(b)
# [1, 8, 27] 结果放在前面,循环搁后边 a后还可以加入简单的条件判断语句 同时也不局限于[]

map()

相当于一个映射吧

list1 = [1, 2, 3]
# 假设我们有一个函数,作用是将传入的参数平方square()
def square(x):
    return x**2
r = map(square, list1)
print(list(r))
# [1, 4, 9]
#其实实现这么小的一个功能没有必要再额外定义一个函数,lambda表达式就成
list1 = [1, 2, 3]
r = map(lambda x: x**2, list1)
print(list(r))
# [1, 4, 9]

reduce()

from functools import reduce
list1 = [1,2,3,4,5]
r = reduce(lambda x, y: x+y, list1) # 需要有两个参数
print(r)
# (((1+2)+3)+4)+5
# 起始x = 1,y = 2,后来将1+2的值作为新一轮的x
# 还有第三个参数  为运算起始值

未完...


远程的使用Jupyter 真香系列


现在假设你有一台Linux服务器,默认你有Python基础(手动滑稽),恰巧嘞你在Windows上边在练习coding python的时候饱受默认环境摧残,之后你了解到了Anaconda(python环境真香系列)...

Linux服务器安装Anaconda同样会让你顺畅许多(舒服~)

下载安装脚本
wget https://repo.anaconda.com/archive/Anaconda3<版本号>-Linux-x86_64.sh
运行安装向导
bash Anaconda3<版本号>-Linux-x86_64.sh
确认安装成功
conda --version

Linux服务器配置Juypter,Then远程使用Jupyter:

直接在输入命令ipython进入ipython环境

键入

from notebook.auth import passwd
passwd()

输入你记得住的一个密码,之后会产生一个密钥,形如:形如: ’sha1:xxxxxxxxxx’

先复制下来保存好

先生成配置文件
jupyter notebook --generate-config
然后修改配置文件的一些内容

文件很长,不用去找,直接在第一行粘贴上去就行

vim ~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.ip = '*' # 允许访问此服务器的 IP,星号表示任意 IP
c.NotebookApp.password = u'sha1:xxx:xxx' # 之前生成的密码 hash 字串
c.NotebookApp.open_browser = False # 运行时不打开本机浏览器
c.NotebookApp.port = 12684 # 使用的端口,随意设置
c.NotebookApp.enable_mathjax = True # 启用 MathJax
目前能启动服务了
Jupyter notebook

在浏览器里输入你的IP地址后边别忘了加上端口号,就可以成功访问Jupyter了(你得输入你先前设置的密码,不是那个hash),但是你发现在你关闭xshell(鄙人使用xshell连接的Linux服务器),你正在访问的Jupyter就访问不了了,要是能访问的话,我在其他没有python环境的电脑上同样也能coding python,那样该多好~

现在我们让他后台运行

启动的时候这样启动

nohup jupyter notebook --allow-root > jupyter.log 2>&1 &
  • &让命令后台运行, 并把标准输出写入jupyter.log中
  • nohup表示no hang up, 就是不挂起, 于是这个命令执行后即使终端退出, 也不会停止运行
关闭进程

在执行上一步操作后使用命令查看当前任务的进程

ps -a

当你不想使用Jupyter的时候,杀掉这个进程(-n是你上一步查看到的进程pid)

kill -n pid
enjoying it~~~

Python爬虫第一幕


什么是Urllib

Python内置的HTTP请求库
  • urllib.request 请求模块
  • urllib.error 异常处理模块
  • urllib.parse url解析模块
  • url.robotparser robots.txt解析模块

urllib相比于Python2的变化

Python2
import urllib2
response = urllib.urlopen('http://www.baidu.com')
Python3
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')

MongonDB安装配置服务


MongonDB下载地址:

社区版请点击此处

安装注意问题:

你可以自定义安装,但是请取消取消取消它默认勾选的这个!!!不然安装时间能让你等的怀疑人生:

TIM图片20200113200719.png

MongoDB配置:

在MongoDBdata目录下创建文件用来存放数据库文件:

“D:Program FilesMongoDBServer4.2MongoDBdatadb”因为启动mongodb服务之前必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。
命令行进入bin目录,输入mongod --depath <你新建的db文件夹的路径>,回车
验证启动成功:
在浏览器输入localhost:27017(27017为默认端口号)

TIM图片20200113202359.png

若出现上图所示,则表明服务启动成功

配置为服务:

在MongoDB目录下创建log文件夹,再在log文件夹下创建mongod.log日志文件
命令行进入bin目录下,输入以下命令:
mongod --bind_ip 0.0.0.0 --logpath D:Program FilesMongoDBServer4.2MongoDBdatalogsmongo.log --logappend --dbpath D:Program FilesMongoDBServer4.2MongoDBdatadb --port 27017 --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install
命令中所示路径以你自己安装的路径为准
成功的话,如下图所示没有报错的话,则配置成功(老版本,现在安装的时候有个选项勾选上,应该就能直接配置成为服务了,自己试一下也是可以的)

TIM图片20200113202554.png
TIM图片20200113202617.png

可视化操作客户端推荐:

https://robomongo.org/


召唤看板娘