虚拟环境 — Python最佳实践指南
虚拟环境是一个将不同项目所需求的依赖分别放在独立的地方的一个工具,它给这些工程创建虚拟的Python环境。它解决了“项目X依赖于版本1.x,而项目Y需要项目4.x”的两难问题,而且使你的全局site-packages目录保持干净和可管理。
比如,你可以工作在一个需求Django 1.3的工程,同时维护一个需求Django 1.0的工程。
virtualenv 是一个创建隔绝的Python环境的工具。virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包。
通过pip安装virtualenv:
$ cd my_project_folder
$ virtualenv venv
virtualenv venv 将会在当前的目录中创建一个文件夹,包含了Python可执行文件,以及 pip 库的一份拷贝,这样就能安装其他包了。虚拟环境的名字(此例中是 venv )可以是任意的;若省略名字将会把文件均放在当前目录。
在任何你运行命令的目录中,这会创建Python的拷贝,并将之放在叫做 venv 的文件中。
你可以选择使用一个Python解释器:
$ virtualenv -p /usr/bin/python2.7 venv
这将会使用 /usr/bin/python2.7 中的Python解释器。
$ source venv/bin/activate
当前虚拟环境的名字会显示在提示符左侧(比如说 (venv)你的电脑:你的工程 用户名$)以让你知道它是激活的。从现在起,任何你使用pip安装的包将会放在 venv 文件夹中,与全局安装的Python隔绝开。
像平常一样安装包,比如:
这将会回到系统默认的Python解释器,包括已安装的库也会回到默认的。
要删除一个虚拟环境,只需删除它的文件夹。(要这么做请执行 rm -rf venv )
然后一段时间后,你可能会有很多个虚拟环境散落在系统各处,你将有可能忘记它们的名字或者位置。
运行带 --no-site-packages 选项的 virtualenv 将不会包括全局安装的包。这可用于保持包列表干净,以防以后需要访问它。(这在 virtualenv 1.7及之后是默认行为)
为了保持你的环境的一致性,“冷冻住(freeze)”环境包当前的状态是个好主意。要这么做,请运行:
$ pip freeze > requirements.txt
这将会创建一个 requirements.txt 文件,其中包含了当前环境中所有包及各自的版本的简单列表。你可以使用 “pip list”在不产生requirements文件的情况下,查看已安装包的列表。这将会使另一个不同的开发者(或者是你,如果你需要重新创建这样的环境)在以后安装相同版本的相同包变得容易。
$ pip install -r requirements.txt
这能帮助确保安装、部署和开发者之间的一致性。
最后,记住在源码版本控制中排除掉虚拟环境文件夹,可在ignore的列表中加上它。
virtualenvwrapper 提供了一系列命令使得和虚拟环境工作变得愉快许多。它把你所有的虚拟环境都放在一个地方。
安装(确保 virtualenv 已经安装了):
$ pip install virtualenvwrapper
$ export WORKON_HOME=~/Envs
$ source /usr/local/bin/virtualenvwrapper.sh
对于Windows,你可以使用 virtualenvwrapper-win 。
To install (make sure virtualenv is already installed): 安装(确保 virtualenv 已经安装了):
$ pip install virtualenvwrapper-win
在Windows中,WORKON_HOME默认的路径是 %USERPROFILE%Envs 。
这会在 ~/Envs 中创建 venv 文件夹。
或者,你可以创建一个项目,它会创建虚拟环境,并在 $PROJECT_HOME 中创建一个项目目录。当你使用 workon myproject 时,会 cd -ed 到项目目录中。
virtualenvwrapper 提供环境名字的tab补全功能。当你有很多环境,并且很难记住它们的名字时,这就显得很有用。
workon 也能停止你当前所在的环境,所以你可以在环境之间快速的切换。
lsvirtualenv- 列举所有的环境。
cdvirtualenv- 导航到当前激活的虚拟环境的目录中,比如说这样你就能够浏览它的
site-packages。 cdsitepackages- 和上面的类似,但是是直接进入到
site-packages目录中。 lssitepackages- 显示
site-packages目录中的内容。
有了 virtualenv-burrito ,你就能使用单行命令拥有virtualenv + virtualenvwrapper的环境。
当你 cd 进入一个包含 .env 的目录中,就会 autoenv 自动激活那个环境。
使用 brew 在Mac OS X上安装它:
在Linux上:
$ git clone git://github.com/kennethreitz/autoenv.git ~/.autoenv
$ echo 'source ~/.autoenv/activate.sh' >> ~/.bashrc
ubuntu redash 开发环境配置
配置流程
1. 安装docker
2. 安装shadowsocks
由于在github上面下载代码总是出现下载失败的情况,而且下载一个东西总是很慢,我们还是开一下VPN吧。
具体安装方法可以参考 ubuntu 下使用 shadowsocks
3. 安装git ,并克隆代码
安装github,克隆代码到本地。
4. 安装docker-compose
5. 安装nodejs
curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
sudo apt-get install -y nodejs
6. docker-compose up
执行docker-compose up即可
记得提前执行 pip --default-timeout=100000 install -U PIP 将超时时间设置长一些。
隐形url跳转实现
显性url和隐形url
显性/隐性URL转发流程
解析
1、域名管理员解析heytool.com,选择隐性或者显性url转发,记录值写上http://www.heytool.com 或者你想要跳转的地方
2、dns提供商将heytool.com解析到他们的服务器上,并且这台服务器上配置了虚拟主机heytool.com
2.1 显性URL跳转:配置里将所有到这的请求跳转到www.heytool.com.
2.2 隐性URL转发:站点里面的index.html面加上iframe,在里面嵌套www.heytool.com.所以不管你怎么点链接,url地址栏都不会变化.除非你的连接是打开新页面
访问
- 用户在浏览器中输入heytool.com
- 浏览器做DNS解析,返回54.248.82.230(延续我的例子),浏览器访问54.248.82.230上的heytool.com
2.1 显性URL转发:服务器将你跳转到www.heytool.com
2.2 隐性URL转发:服务器返回一个嵌套www.heytool.com地址的index.html文件,浏览器再次去访问www.heytool.com,并且内容嵌套在index.html里,所以用户就看不到有任何跳转.(不推荐)
隐形url配置方法
在nginx中配置
server {
listen 80;
server_name ***.***.com;
location / {
alias /opt/agent/;
index index.html;
}
}
配置index文件
<HTML><frameset rows="100%" ><frame src="https://www.hansap.com/agent/713"></frameset></HTML>
这样在访问网站的时候,会在内部的url中隐形跳转到内部页面。
多页面的自动化配置
针对以后的多页面,可以采用自动化配置
- 配置文件路径,在类似_opt_agent路径下自动化添加index.html文件;
- 在文件中动态填入内容,其中用户需要填入相应的需要跳转的url 地址;
- 配置单独的nginx配置文件;
- 每次有新的代理商进入的时候,追加配置文件内容;
- 添加相应的server_name 为代理商提供的域名;
- 添加location里面相应的目录,到我们之前配置的index.html文件上;
- nginx -s reload重启一下nginx就可以生效了。
tips
- 在html中可以加上head里面的title 和 Keyword相关的内容
- 在html中加上相关的统计代码,统计服务器访问信息。
ubuntu 安装redash
- release
安装临时插件
apt-get update
apt-get install git
git clone https://github.com/yourwilliam/redash
$ sudo apt-get install python-pip python-dev build-essential
$ sudo pip install --upgrade pip
$ sudo pip install --upgrade virtualenv
换源
1.临时换源
临时换源只在某一条命令中生效,只要在命令中加上”-i“,指定使用的源即可
pip install scrapy -i
2.永久换源
要是想彻底将pip的源换掉,只要在pip的配置文件(~_.pip_pip.conf)中增加
[global]
index-url=http://pypi.douban.com/simple
3.一些国内的pip源
http://pypi.douban.com/simple #豆瓣
http://pypi.hustunique.com/simple #华中理工大学
http://pypi.sdutlinux.org/simple #山东理工大学
http://pypi.mirrors.ustc.edu.cn/simple #中国科学技术大学
pip 测试可用的换源方式,一定要使用这一个,而且一定要用https
pip install wagtail -i https://pypi.douban.com/simple
初步安装
root@ubuntu:/opt/redash# virtualenv redashenv
root@ubuntu:/opt/redash# source redashenv/bin/activate
(redashenv) root@ubuntu:/opt/redash# sudo apt-get install libpq-dev
(redashenv) root@ubuntu:/opt/redash/setup/ubuntu# cd /opt/
(redashenv) root@ubuntu:/opt# chmod 777 redash/
(redashenv) root@ubuntu:/opt/redash/setup/ubuntu# sh bootstrap.shd
会报一个这个错
Creating redash postgres user & database.
Traceback (most recent call last):
File "_opt_redash_redash.0.11.1.b2095_manage.py", line 7, in
from flask_script import Manager
ImportError: No module named flask_script
修改
vi /opt/redash/redash.0.11.1.b2095/manage.py
#!/opt/redash/redashenv/bin/python
再次执行安装
还会报一个错:
peewee.ProgrammingError: relation "organizations" does not exist
LINE 1: ...", "t1"."name", "t1"."slug", "t1"."settings" FROM "organizat…
要重新配置数据库
(redashenv) root@ubuntu:/opt/redash/setup/ubuntu# su - postgres
psql
ostgres=# drop database redash;
DROP DATABASE
postgres=# drop user redash;
DROP ROLE
退出 继续安装
在起一次就能成功了,显示
2016-11-20 14:47:08 (68.7 MB_s) - ‘_etc_nginx_sites-available/redash’ saved [453/453]
* Restarting nginx nginx [ OK ]
就OK了。
修改数据库权限
创建root 用户,给予权限
(redashenv) root@ubuntu:/opt/redash/setup/ubuntu# su - postgres
postgres@ubuntu:~$ psql
postgres=# create user root;
postgres=# ALTER ROLE root SUPERUSER;
ALTER ROLE
启动redash_server
还是会报错:
(redashenv) root@ubuntu:/opt/redash/redashenv/bin# mkdir /opt/redash/logs
(redashenv) root@ubuntu:/opt/redash/redashenv/bin# supervisord -c /opt/redash/setup/ubuntu/files/supervisord.conf
(redashenv) root@ubuntu:/opt/redash/redashenv/bin# mkdir /opt/redash/logs
(redashenv) root@ubuntu:/opt/redash/redashenv/bin# supervisord -c /opt/redash/setup/ubuntu/files/supervisord.conf
(redashenv) root@ubuntu:/opt/redash/redashenv/bin# supervisorctl restart redash_server
redash_server: stopped
redash_server: started
维护redash参考 http://docs.redash.io/en/latest/usage/maintenance.html
这还没完
仔细研究了一下,从脚本可以看到 ,是用的redash的账号来启动的。 这里我的安装是改成了使用root来控制。
后面在来研究怎么样用redash账号搞定。
在执行restart all的时候可以看到实际上可以看到redash_celery 是没有起起来的,这样可以看到的结果是感觉redash可以登陆,可以添加使用,但是数据是查不出来的,随便执行一个QUERY就可以看到。这是要控制celery的话需要再配置
从报错可以看到
Running a worker with superuser privileges when the
worker accepts messages serialized with pickle is a very bad idea!
If you really want to continue then you have to set the C_FORCE_ROOT
environment variable (but please think about this before you do).
User information: uid=0 euid=0 gid=0 egid=0
就是celery不推荐使用root来执行,需要修改
网上有几种办法,一种是使用 export C_FORCE_ROOT=‘true’ 这种是不管用的
另外一种是添加
platforms.C_FORCE_ROOT = True #添加这一行
这个是可以的,需要把这个添加的work中
vi _opt_redash_redash.0.11.1.b2095_redash/worker.py
http://redn.net/content/解决celery在root用户下启动问题cforceroot-environment
然后再执行:
(redashenv) root@ubuntu:/opt/redash/redashenv/bin# supervisorctl restart all
redash_server: stopped
redash_celery: started
redash_server: started
redash_celery_scheduled: started
测试后方可。
至此ubuntu版本的全部安装完毕
邮件配置:
在.env环境中配置 _opt_redash/.env 中
export REDASH_STATIC_ASSETS_PATH="../rd_ui/dist/"
export REDASH_LOG_LEVEL="INFO"
export REDASH_REDIS_URL=redis://localhost:6379/0
export REDASH_DATABASE_URL="postgresql://redash"
export REDASH_COOKIE_SECRET=veryverysecret
export REDASH_MAIL_SERVER="smtp.hansap.com"
export REDASH_MAIL_PORT="25"
export REDASH_MAIL_USE_TLS="false"
export REDASH_MAIL_USE_SSL="false"
export REDASH_MAIL_USERNAME="hansap@hansap.com"
export REDASH_MAIL_PASSWORD="Fire@123"
export REDASH_MAIL_DEFAULT_SENDER="hansap@hansap.com"
export ERDASH_HOST="http://bi.hansap.com"
配置完成后可以测试
(redashenv) root@ubuntu:/opt/redash/current# bin/run ./manage.py send_test_mail
注意一定要在current下测试,而且一定要按照这个目录来执行。
执行完成后重启
(redashenv) root@ubuntu:/opt/redash/redashenv/bin# supervisorctl restart all
配置完成
新版本
需要在全局路径(非virtualENV环境下装上redis依赖包才可以 'pip install redis')
django sitemap 框架
sitemap的作用
通过这个站点可以查看一下自己网站的sitemap,从而可以查询到相关的浏览器索引项目http://www.sitemap-xml.org/
如果主页没有到index.html,而是跳转到其他的页面,可能2会出现无法索引的情况。
Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。基本上所有的搜索引擎都集成了各自的sitemap爬取方式供浏览器来调用。每个公司也设置了自己的sitemap格式形式,但是基本还是类似的。
sitemap 的 django实现
在setting.py的INSTALLED_APPS 里面添加django.contrib.sitemaps
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'django.contrib.sitemaps',
'django_comments',
'blog',
'pagination',
'tagging',
'mshow',
'pagedown',
'markdown_deux',
]
修改相关的Templates配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates').replace('\\', '/'),],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.request',
],
},
},
]
添加urls 到根目录以及相应的sitemaps
sitemaps = {
'blog': GenericSitemap({'queryset': Entry.objects.all(), 'date_field': 'publication_date'}, priority=0.6),
}
urlpatterns = [
url(r'^$', views.blog, name="index"),
url(r'^admin/', admin.site.urls),
url(r'^mshow/', include('mshow.urls', namespace='mshow')),
url(r'^blog/', include('blog.urls', namespace='blog')),
url(r'^comments/', include('django_comments.urls')),
url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},name='django.contrib.sitemaps.views.sitemap'),
]
在models里面添加get_absolute_url,凡是需要形成sitemap的类都需要有这个项
def get_absolute_url(self):
return "/blog/single/%i/" % self.id
完成之后访问sitemap.xml就可以访问网站的sitemap了,后面还有一些其他功能等待补充。
django 生产环境 nginx+uwsgi环境安装
django 生产环境
django部署生产环境使用的比较多的是nginx+uwsgi和 apache+mod_python
由于对nginx比较熟一些,所以这里先使用nginx来进行部署。
安装pip
$ sudo apt-get install python-pip python-dev build-essential
$ sudo pip install --upgrade pip
$ sudo pip install --upgrade virtualenv
安装uwsgi
将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。
第一步先解决uwsgi与django的桥接。解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器。
第二步解决uwsgi与Nginx的桥接。通过nginx与uwsgi的桥接,打通nginx与django的连通,从而比较完美的实现django的部署。
安装uwsgi
$ export LDFLAGS="-Xlinker --no-as-needed"
$ pip install uwsgi
测试uwsgi
在你的机器上写一个test.py
#test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
然后执行shell命令:
uwsgi --http :8001 --wsgi-file test.py
访问网页:
http://127.0.0.1:8001/
看在网页上是否有Hello World
安装django
django安装,我用的是比较新的版本,由于老版本总是出现这样那样的问题,也和最新的文档对接不上,django的版本升级实在是太快了。
sudo pip install django==1.9.6
安装git
安装git,来远程获取代码
sudo apt-get install git
安装好git之后需要导入我的代码,创建一个目录,然后在目录下
git init
git clone https://github.com/yourwilliam/melonblog
就可以将代码clone到本地了。
安装pip
使用django还需要把代码依赖的python包考到本地,这里也使用pip来管理,pip的安装和配置参看其他的博客中有介绍。
安装MySQL数据库和相关python驱动包
sudo apt-get install mysql-server
apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo apt-get install python-mysqldb
创建数据库
需要 create database
使用python来创建数据库
python manage.py migrate
# 创建数据库
python manage.py makemigrations blog
python manage.py makemigrations mshow
# 创建各个APP的数据库
python manage.py migrate
启动django做测试
python manage.py runserver 0.0.0.0:8001
root@iZ23b233aiuZ:/home# pip install django-wsgi
配置uwsgi
详细可以参考
五步教你实现使用Nginx+uWSGI+Django方法部署Django程序上
五步教你实现使用Nginx+uWSGI+Django方法部署Django程序下
编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下
编写文件时需要注意语句os.environ.setdefault。比如,如果你的项目为mysite,则你的语句应该是 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
#!/usr/bin/env python
# coding: utf-8
import os
import sys
# 将系统的编码设置为UTF8
reload(sys)
sys.setdefaultencoding('utf8')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
升级了django和wsgi新版本之后这里需要改为
#!/usr/bin/env python
# coding: utf-8
import os
import sys
# 将系统的编码设置为UTF8
import django
reload(sys)
sys.setdefaultencoding('utf8')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hansapwiki.settings")
django.setup()
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
启动
udo uwsgi --http :8000 --chdir /opt/melonblog/melonblog --module django_wsgi
在这里的时候访问页面,出现css,js或者图片无法加载,可以不用担心,因为此时uwsgi仅仅处理数据请求,这些静态文件需要使用nginx来读取,在配置好nginx之后就可以配置了。
配置uwsgi的XML文件
djangochina_socket.xml, 将这个文件配置为
<uwsgi>
<socket>:8077</socket>
<chdir>/opt/melonblog/melonblog</chdir>
<module>django_wsgi</module>
<processes>4</processes> <!-- 进程数 -->
<daemonize>uwsgi.log</daemonize>
</uwsgi>
安装nginx
安装nginx
sudo apt-get install nginx
#启动、停止和重启
sudo /etc/init.d/nginx start
sudo /etc/init.d/nginx stop
sudo /etc/init.d/nginx restart
#或者
sudo service nginx start
配置nginx
使用apt-get获取的nginx默认的在_etc_nginx/ 下,修改下面的nginx.conf 文件
server {
listen 80;
server_name 121.41.8.92;
access_log /var/log/nginx/melonblog/access.log;
error_log /var/log/nginx/melonblog/error.log;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8077;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /static/ {
alias /opt/melonblog/melonblog/blog/static/;
index index.html index.htm;
}
location /media/ {
alias /opt/melonblog/melonblog/blog/static/media/;
}
}
这样便设置了上面的目录结构
配置完成后重启nginx nginx -s reload
启动uwsgi服务器
cd /opt/melonblog/melonblog/
uwsgi -x djangochina_socket.xml
关闭uwsgi进程的方法
ps -ef|grep uwsgi
#如果启动没有完成,这个是没有进程的,有进程代表启动成功
kill -9 *****
#将所有的进程杀死可以完成
其他配置
admin的样式问题
由于后台使用admin 模块,在django服务器中,会默认的将所有的static文件都写入到static目录中。但是此时是由nginx来进行静态文件转发,所以无法转发,需要在转发中添加admin部分的静态文件,在nginx配置文件中添加
location /static/admin/ {
alias /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/;
}
Copyright © 2020 鄂ICP备16010598号-1



