新浪云手册

SAE Python 开发者手册 - 本地开发环境

Sinacloud django web框架

sae-python-dev SAE 集成开发环境

安装

pip install sae-python-dev

参考文档

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,如果光修改表不行,就重新生成数据库

数据库导入和导出

导出数据库

导出数据表

导入数据库或表

本地访问

其中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/

其他文档

数据保存

数据库 数据文件 资源文件

评论