新浪云手册
sae-python-dev SAE 集成开发环境
安装
pip install sae-python-dev
参考文档
- http://sae-python.readthedocs.io/en/latest/tools.html#id3
- https://pypi.python.org/pypi/sae-python-dev
- SAE: Python Django 如何 syncdb 到线上数据库
- sae服务器,mysql数据库配置流程
- Django教程:[35]配置SAE本地开发环境
- No module named _restful_mysql
- Django教程:[36]自动更新SAE mysql数据库
SAE的配置文件主要有两个:config.yaml和index.wsgi
新浪云(SAE)使用没有内置的django版本
SAE自带的django目前到1.5版本,如果要使用更高的版本,则需要把django包同代码一起上传。 工作目录:D:\virtualenv\zakkabag\zakkabag
(1). 目录下创建文件夹 site-packages ,
把django包copy到此文件夹
django包在python安装目录中 如 C:\Python27\Lib\site-packages\django
(2). 最后的工作目录如下 >
(zakkabag) D:\virtualenv\zakkabag\src>ls README.md debug newsletter requirements.txt static_in_env zakkabag carts index.wsgi orders site-packages static_in_pro config.yaml manage.py products static templates
(3). 修改 index.wsgi,sae使用
+import sys
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'zakkabag.settings'
sys.path.append(os.path.join(os.path.dirname(__file__),'zakkabag'))
+root = os.path.dirname(__file__)
+sys.path.insert(0, os.path.join(root, 'site-packages'))
import sae
from zakkabag import wsgi
application = sae.create_wsgi_app(wsgi.application)
(4). 修改wsgi.py,本地调试使用
import os
+import sys
+root = os.path.dirname(__file__)
+sys.path.insert(0, os.path.join(root, '..', 'site-packages'))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "zakkabag.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
(5). 可在view中进行测试
from django.shortcuts import render
from django.http import HttpResponse
import django
def home(request):
return HttpResponse("Hello, django! version: " + str(django.VERSION))
(6). config.yaml
参考 SAE应用程序配置文档
name: zakkabag
version: 1
libraries:
- name: "django"
version: "1.8.4"
- name: "chardet"
version: "2.3.0"
- name: "six"
version: "1.8.0"
- name: "Pillow"
version: "4.1.0"
handlers:
- url: /static/
static_path: static_in_env/static_root
静态文件 url.py 增加配置如下
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
参考: 在新浪云上部署Django应用程序 (跟Heroku类似,没试过) 新浪SAE部署django博客 SAE新浪云Python添加Django模块
Procfile
web: gunicorn zakkabag.wsgi --log-file -
需要安装gunicorn库
SAE环境变量
if not 'SERVER_SOFTWARE' in os.environ:
cannot import name _imaging
解决方案:删除site-packages里面的PIL库,这个跟系统的重复了
另外,PIL库里面依赖_imaging模块,Windows下面是_imaging.pyd,Linux下面是_imaging.so,不兼容也可能跟这个有关
邮件配置
数据库
手册
model里foreign不要用大写,会跟mysql不匹配
Incorrect string value:"\ \ \ \ \"for column'trurname' at row 1
修改mysql为utf-8,如果光修改表不行,就重新生成数据库
数据库导入和导出
Navicat for MySQL
导出数据库
导出数据表
导入数据库或表
本地访问
其中szakkabag是数据库名 (不是实例名),用户名和密码是自己创建的,共享数据库的是系统分配的
首先要开启VPN通道,安装工具OpenVPN
phpMyAdmin
- Sina Cloud - 管理数据库
问题1: mysql导出的文件导入时碰到问题
-- LOCK TABLES `auth_permission` WRITE;
/*!40000 ALTER TABLE `auth_permission` DISABLE KEYS */;
INSERT INTO `auth_permission` VALUES (1,'Can add product_class',1,'add_product_class'),(2,'Can ………….PreCI_Request',32,'delete_preci_request');
/*!40000 ALTER TABLE `auth_permission` ENABLE KEYS */;
-- UNLOCK TABLES;
LOCK/UNLOCK 需删除,否则报错
新浪云数据库配置
import dj_database_url
# Parse database configuration from $DATABASE_URL
DATABASES['default'] = dj_database_url.config(default="mysql://root:root123@prqricrbrexa.mysql.sae.sina.com.cn:10180/zakkabag")
需要安装库dj_database_url,config的参数可以从新浪云数据库里面可以获取
容器
创建容器 link
基本抄袭Heroku,log里都有heroku字样
优势
- media文件可以本地存储
- python dependency package可以用pip安装
容器访问
工具
- ssh: SecureCRT
- sftp: FileZilla
共享内存
如果想把媒体问题改为共享内容,设置挂载路径为 /app/static_in_env/media_root
注意: 一旦挂载,原来的内容会被替换;卸载之后会恢复
Storage
SAE是只读的,所以如果要上传文件,需要配置storage
如果是容器类型,可以直接在容器里存储media文件。 容器试下来用Bucket一直有问题,总是因为环境变量的问题在storage.py里面报错,包括
def generate_url(self, bucket, obj):
return 'http://%s/stor-stub/%s/%s' % \
(os.environ['HTTP_HOST'], bucket, q(obj))
_STORAGE_PATH = os.environ.get('sae.storage.path')
在新浪云里面添加bucket: media
FILE_UPLOAD_MAX_MEMORY_SIZE = 10485760 # 10M
DEFAULT_FILE_STORAGE = 'sae.ext.django.storage.backend.Storage'
STORAGE_BUCKET_NAME = 'media'
1)对于正常的后台文件上传,这种方式是工作的
def image_upload_to_featured(instance, filename):
title = instance.product.title
slug = slugify(title)
basename, file_extension = filename.split(".")
new_filename = "%s-%s.%s" %(basename[:60], instance.id, file_extension)
return "products/featured/%s/%s" %(slug[:40], new_filename)
class ProductFeatured(models.Model):
product = models.ForeignKey(Product)
image = models.ImageField(upload_to=image_upload_to_featured)
title = models.CharField(max_length=120, null=True, blank=True)
text = models.CharField(max_length=220, null=True, blank=True)
text_right = models.BooleanField(default=False)
text_css_color = models.CharField(max_length=6, null=True, blank=True)
show_price = models.BooleanField(default=False)
make_image_background = models.BooleanField(default=False)
active = models.BooleanField(default=True)
def __unicode__(self):
return self.product.title
文件在bucket里的存储位置为 media-products-featured-[iphone]-[wx_camera_1503051498172-8.jpg]
完整的网络地址为:http://zakkabag-media.stor.sinaapp.com/products/featured/iphone/wx_camera_1503051498172-8.jpg
2)如果是直接文件的读写
class ProductCreateView(CreateView):
def post(self, request, *args, **kwargs):
postresult = super(ProductCreateView, self).post(request, *args, **kwargs)
if ProductImageForm(request.POST, request.FILES).is_valid():
in_mem_image_file=request.FILES['image']
if in_mem_image_file:
photoname = upload_to(in_mem_image_file, self.object.title, self.object.id)
if 'SERVER_SOFTWARE' in os.environ:
from sae import storage
#from sae.storage import Bucket
#bucket = Bucket('media')
c = storage.Connection()
bucket = c.get_bucket('media')
bucket.put_object(photoname,in_mem_image_file.file.getvalue())
#object_content = bucket.get_object_contents(photoname)
else:
img=Image.open(in_mem_image_file)
img.save(os.path.join(settings.MEDIA_ROOT, photoname))
ProductImage.objects.create(product = self.object,
image = photoname)
return postresult
本地可以通过FTP访问
可以采用工具Cyberduck便于上传和下载
上传文件后,SINA云网页显示会有重复,可以通过客户端来看准确的结果
官方文档
- http://www.sinacloud.com/doc/sae/python/tutorial.html#django
- http://www.sinacloud.com/doc/sae/python/storage.html
- https://docs.djangoproject.com/en/1.7/topics/files/
- https://docs.djangoproject.com/en/1.7/howto/static-files/
- https://docs.djangoproject.com/en/1.7/ref/contrib/staticfiles/
其他文档
- * django 上传图片、使用PIL制作缩略图并保存到sea的storage
- https://github.com/csuzhangxc/Flask-SaeStorage
- https://pypi.python.org/pypi/django-sae/0.2.0
- SAE Storage for Django
- Django的文件上传和部署到SAE上文件上传策略
- Django在新浪SAE中使用storage服务实现文件上传保存
- 使用sae的storage服务来自动保存数据库文件
- SAE与Django的FileField
- https://pypi.python.org/pypi/django-qiniu-storage/2.1.1
数据保存
数据库 数据文件 资源文件
评论
留言请先登录或注册! 并在激活账号后留言!