十分钟上线-在函数计算上部署基于django开发的个人博客系统

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 函数计算已经发布了http trigger的功能,利用函数计算的http trigger,可以在将基于wsgi application创建的工程部署或者迁移到函数计算,本文讲解一个基于django开发的个人博客系统迁移到FC, 展示函数计算做web backend 能力以及很低迁移成本

前言

这篇文章适合所有的python开发新手、老鸟以及想准备学习开发python的程序猿。本文以一个基于django开源的个人博客移植到函数计算为例,向您讲解如何使用阿里云函数计算快速构建或移植基于wsgi applicaiton开发的web service。通过本文,您将会了解以下内容:

案例概览

在本教程中,我们讲解如何利用函数计算一步一步来构建web的server端,该案例是基于github上一个star很高的一个开源个人博客,在本案例中,不讨论基于wsgi applicaiton的程序开发,本文旨在展示函数计算做web backend 能力,具体表现为以下几点:

  • 完善的基于django搭建的系统迁移到FC的成本不高
  • FC打通了专有网络vpc功能,用户的函数可以配置访问专有网络的云资源,比如本案例中mysql
  • fun工具自动化部署函数计算及相关资源的能力

传统服务器架构 VS Serverless架构

正常来说,用户开发server端服务,常常面临开发效率,运维成本高,机器资源弹性伸缩等痛点,而使用Serverless架构可以很好的解决上述问题。下面是传统架构和Serverless架构的对比:
image

阿里云函数计算是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询,性能监控,报警等功能。借助于函数计算,您可以快速构建任何类型的应用和服务,无需管理和运维。

Serverless架构详解

image

从上面的示例图中,整体架构十分简单明了, 用FC替代了web服务器,但是换来的是免运维,弹性扩容,按需付费等一系列优点

案例迁移中存在的问题及解法

Q1: FC python runtime 支持url 访问函数?

是的,函数计算具有http trigger 功能, 详情

Q2: 某些网页引用了static目录中js,css等文件,会出现找不到的情况

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_FC_URL = STATIC_URL
AI 代码解读

入口函数代码所示, 在调用django application之前设置好settings.STATIC_URL,同时在urls.py 设置好路由:

urlpatterns += static(settings.STATIC_FC_URL, document_root=settings.STATIC_ROOT)
AI 代码解读

Q3: 之前的数据库数据如何迁移,或者说如何直接初始化需要的数据库

  • 正常的数据库迁移,先导出数据库数据,然后直接导入,很多客户端工具或者命令行工具都支持
  • 初始化数据库,直接配置好对应的配置文件,使用python manage.py migrate命令即可

Q4:python 3.6 中没有MySQLdb, 如何使用django?

python 3.6, django 1.11 配置mysql数据库

Q5: 如果是上传文件的需求,函数计算将怎么保存上传的文件

可以将文件上传到oss,然后在html页面上引用oss link

入口函数代码

# coding=utf-8
import sys
import os

# load local django
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "blogproject"))
import django

print (django.__version__)

from urllib.parse import urlparse
from blogproject.wsgi import application
from django.conf import settings 

base_path = None

def handler(environ, start_response):
  # 如果没有使用自定义域名
  if environ['fc.request_uri'].startswith("/2016-08-15/proxy"):
    request_uri = environ['fc.request_uri']
    parsed_tuple = urlparse(request_uri)
    li = parsed_tuple.path.split('/')
    global base_path
    if not base_path:
      base_path = "/".join(li[0:5])
      settings.STATIC_URL = base_path + settings.STATIC_FC_URL

    context = environ['fc.context']
    environ['HTTP_HOST'] = '{}.{}.fc.aliyuncs.com'.format(context.account_id, context.region)
    environ['SCRIPT_NAME'] = base_path + '/'

  return application(environ, start_response)
AI 代码解读

案例开发配置步骤

准备工作

  • 预先安装python3, virtualenv, mysql,注:后面的python环境指的都是python3
  • 创建并激活虚拟环境,在命令行进入到保存虚拟环境的文件夹,输入如下命令创建并激活虚拟环境:

    virtualenv blogproject_env
    
    # windows
    blogproject_env\Scripts\activate
    
    # linux/mac
    source blogproject_env/bin/activate
    
    AI 代码解读

    如果不想使用虚拟环境,可以跳过这一步

  • 克隆需要迁移的项目到本地
    git clone https://github.com/zmrenwu/django-blog-tutorial.git

  • 下载项目依赖到本地
    如果使用了虚拟环境,确保激活并进入了虚拟环境,在命令行进入项目所在的django-blog文件夹,运行如下命令:
    pip install -t . -r requirements.txt

  • 修改相应的配置文件,确保在本地能正常运转

    • 使用本地的django库,修改的文件manage.py, 在函数逻辑之前增加两句如下代码:

      sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
      import django
      
      AI 代码解读
    • 修改setting.py 中的DATABASES,修改成连接自己本地mysql

      DATABASES = {
             
        'default': {
             
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django-blog',   #数据库名
        'USER': 'root', #用户名
        'PASSWORD': 'Passw0rd', #密码
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'CHARSET':'utf8',##设置字符集,不然会出现中文乱码
        }
      }
      
      AI 代码解读
    • 修改setting.py中的ALLOWED_HOSTS成ALLOWED_HOSTS = ['*']
  • 迁移数据库
    python manage.py migrate
    如果这里正常执行,应该会自己本地mysql数据库能看到相关table创建成功

  • 创建后台管理员账户
    python manage.py createsuperuser

  • 运行开发服务器
    python manage.py runserver
    在浏览器输入:127.0.0.1:8000

  • 进入后台发布文章
    在浏览器输入:127.0.0.1:8000/admin, 用上一步创建的user应该能登录成功

创建RDS mysql数据库, 并做好相应的配置和初始化工作

由于函数运行时的IP是不固定的,您需要设置RDS允许所有IP访问。但是这样会有风险,不建议这样做。在本教程中,我们将创建一个rds mysql 数据库,并将它置于一个专有网络VPC环境内,函数计算会支持VPC功能,用户可以通过授权的方式安全地访问VPC中的资源。

  • 开通购买rds-mysql,登录rds控制台,创建数据库django-blog,并构建vpc环境
    image

    • vpc 的详情如下:
      image
      image
      image

    配置函数计算访问 VPC 内的资源, 假设配置完毕后,我们这里的vpc config 如下:

      VpcConfig:
            VpcId: 'vpc-j6c4u85w9m4ovnvf45x76'
            VSwitchIds: [ 'vsw-j6cuqvtuc041zyvm415xx' ]
            SecurityGroupId: 'sg-j6c35vamnn01ekx91xx'
            InternetAccess: true
    
    AI 代码解读
  • 初始化django-blog数据库,这里有个示例可以下载:blog.sql,示例中

image

image

image

image

image

利用fun工具,对相应的工程进行自动化部署

1.安装fun工具

npm install git://github.com/aliyun/fun.git --save -g
AI 代码解读

2. 编写入口函数文件main.py

入口函数代码

3. 更改对应的配置和内容

  • setting.py 中的DATABASES,改成上一步创建的rds mysql
  • 按照案例迁移中存在的问题及解法更改setting.pyurls.py

    注:涉及到setting的修改,可以使用函数计算的环境变量功能, 不用将这些配置信息写死到代码中,大大提高了函数灵活性。环境变量是在函数级别的,以键值对的方式存储作为函数配置的一部分,即一个服务的不同函数拥有不同的环境变量,并且互不影响。环境变量的主要用途是代码和配置相分离,提高代码的灵活性和可移植性。比如DATABASES

    DATABASES = {
          
      'default': {
          
      'ENGINE': os.environ['CUSTOM_DB_ENGINE'],     # engine,django.db.backends.mysql
      'NAME':   os.environ['CUSTOM_DB_NAME'],       # 数据库名, django-blog
      'USER':   os.environ['CUSTOM_DB_USER_NAME'],  # 用户名,root
      'PASSWORD': os.environ['CUSTOM_DB_USER_PWD'], # 密码,Passw0rd
      'HOST': os.environ['CUSTOM_DB_HOST']          # 比如 '127.0.0.1',
      'PORT': os.environ['CUSTOM_DB_PORT']          # 比如'3306',
      'CHARSET':'utf8', #设置字符集,不然会出现中文乱码                     
      }
    }
    
    AI 代码解读

4. 开通使用的相关阿里云产品: 函数计算、日志服务

5. 编写fun的配置文件template.yml.env

  • template.yml example

    ROSTemplateFormatVersion: '2015-09-01'
    Transform: 'Aliyun::Serverless-2018-04-03'
    Resources:
      blog-pro:
        Type: 'Aliyun::Serverless::Log'
        Properties:
          Description: 'blog log pro'
        fc-log:
          Type: 'Aliyun::Serverless::Log::Logstore'
          Properties:
            TTL: 362
            ShardCount: 1 
    
      blog-service:
        Type: 'Aliyun::Serverless::Service'
        Properties:
          Description: 'django blog demo'
          Policies:
            - AliyunOSSFullAccess
          LogConfig:
            Project: 'blog-pro'
            Logstore: 'fc-log'
          VpcConfig:
            VpcId: 'vpc-j6c4u85w9m4ovnvfxxxxx'
            VSwitchIds: [ 'vsw-j6cuqvtuc04xxxxxx5m6' ]
            SecurityGroupId: 'sg-j6c35vabbbbbbbx91vh6'
            InternetAccess: true
        blog:
          Type: 'Aliyun::Serverless::Function'
          Properties:
            Handler: main.handler
            CodeUri: './'
            Description: 'django blog http function'
            Runtime: python3
            Timeout: 60
            MemorySize: 512
          Events:
            http-test:
              Type: Http
              Properties:
                AuthType: ANONYMOUS
                Methods: ['GET', 'POST', 'PUT']
    
    AI 代码解读
  • .env example

    DEFAULT_REGION=cn-hongkong
    ACCOUNT_ID=12345
    ENDPOINT=http://12345.cn-hongkong.fc.aliyuncs.com
    ACCESS_KEY_ID=LTAItxxxx
    ACCESS_KEY_SECRET=WIcnJJO7ZGoTUyyyyyyyyyy
    
    AI 代码解读

6. 执行fun deploy, template.yml 里面的相关资源就能准确创建和配置

image

image

image

image

7. 部署成功后,直接通过url访问首页, url的格式为:

http://${account_id}.${region}.fc.aliyuncs.com/2016-08-15/proxy/$(seevice_name}/{function_name}/
比如:
http://1221968287646227.cn-hongkong.fc.aliyuncs.com/2016-08-15/proxy/blog-service/blog/
AI 代码解读

用户可以在github地址下载完整的案例代码

Improvement

  1. 对于案例迁移中存在的问题及解法里Q3中的静态文件解法问题,这个只是快速迁移的方案,真正迁移强烈建议把文件托管到OSS或者CDN,这个虽然会增加点迁移工作量,但是会减少函数调用(资源请求也是一次函数调用), 也会大大减少代码包的大小,提高函数计算冷启动的表现。

  2. 对于敏感的配置信息,强烈建议不要写在代码文件里面,而是通过设置函数的环境变量实现,比如本案例中数据库的配置;以及不要上传fun 工具使用的.env文件(本案例为了展示而上传)

总结

函数计算有如下优势:

  • 无需采购和管理服务器等基础设施
  • 专注业务逻辑的开发
  • 提供日志查询、性能监控、报警等功能快速排查故障
  • 以事件驱动的方式触发应用响应用户请求
  • 毫秒级别弹性伸缩,快速实现底层扩容以应对峰值压力
  • 按需付费。只需为实际使用的计算资源付费,适合有明显波峰波谷的用户访问场景

除了上面所列的优势,FC 可以做为web backend,只需要修改一些配置文件就可以将wsgi 框架开发的工程迁移到FC,从而从传统的web网站运维,监控等繁琐的事务中解放出来

声明

  • 在此声明,这个案例仅仅是做学习交流展示使用,并没有涉及商业化,使用的素材来自
    github上一个开源的个人博客

  • 欢迎大家通过扫码加入我们用户群中,搭建过程中有问题或者有其他问题可以在群里提出来。
    函数计算官网客户群(11721331)。
    image

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
rsong
+关注
目录
打赏
0
1
1
5
184
分享
相关文章
云大使 X 函数计算 FC 专属活动上线!享返佣,一键打造 AI 应用
如今,AI 技术已经成为推动业务创新和增长的重要力量。但对于许多企业和开发者来说,如何高效、便捷地部署和管理 AI 应用仍然是一个挑战。阿里云函数计算 FC 以其免运维的特点,大大降低了 AI 应用部署的复杂性。用户无需担心底层资源的管理和运维问题,可以专注于应用的创新和开发,并且用户可以通过一键部署功能,迅速将 AI 大模型部署到云端,实现快速上线和迭代。函数计算目前推出了多种规格的云资源优惠套餐,用户可以根据实际需求灵活选择。
阿里云函数计算助力AI大模型快速部署
随着人工智能技术的快速发展,AI大模型已经成为企业数字化转型的重要工具。然而,对于许多业务人员、开发者以及企业来说,探索和利用AI大模型仍然面临诸多挑战。业务人员可能缺乏编程技能,难以快速上手AI模型;开发者可能受限于GPU资源,无法高效构建和部署AI应用;企业则希望简化技术门槛,以更低的成本和更高的效率利用AI大模型。
249 12
DeepSeek 模型快速体验,魔搭+函数计算一键部署模型上云
DeepSeek模型近期备受关注,其开源版本DeepSeek-V3和DeepSeek-R1在多个基准测试中表现出色,性能比肩OpenAI顶尖模型。为降低本地部署门槛,Modelscope社区推出DeepSeek-R1-Distill-Qwen模型的一键部署服务,支持函数计算FC平台的闲置GPU实例,大幅降低成本。用户可选择不同参数量的小模型进行快速部署和推理,体验DeepSeek的强大性能。
DeepSeek 模型快速体验,魔搭+函数计算一键部署模型上云
函数计算×百炼新春活动正式上线!三步赢取蛇年精美好礼
本次场景利用函数计算 FC 构建 Web 服务,由其提供函数计算资源以及工作流能力,您无需管理服务器等基础设施,函数计算 FC 能够根据需求自动扩展,按需计算,结合百炼模型服务实现了从文案、声音、字幕、图像生成到视频合成的一站式自动化流程,大幅简化使用 AI 创作的流程,降低了技术要求,使创作者能够更高效地生产出高质量的内容,快速响应市场需求,同时保证了作品的专业水准和创意表达。
DeepSeek 快速体验,魔搭+函数计算一键部署模型上云
对于期待第一时间在本地进行使用的用户来说,尽管 DeepSeek 提供了从 1.5B 到 70B 参数的多尺寸蒸馏模型,但本地部署仍需要一定的技术门槛。对于资源有限的用户进一步使用仍有难点。为了让更多开发者第一时间体验 DeepSeek 模型的魅力,Modelscope 社区 DeepSeek-R1-Distill-Qwen 模型现已支持一键部署(SwingDeploy)上函数计算 FC 服务,欢迎开发者立即体验。
263 12
一键生成毛茸萌宠形象,基于函数计算极速部署 ComfyUI 生图系统
本次方案将帮助大家实现使用阿里云产品函数计算FC,只需简单操作,就可以快速配置ComfyUI大模型,创建出你的专属毛茸茸萌宠形象。内置基础大模型+常用插件+部分 Lora,以风格化图像生成只需用户让体验键配置简单方便,后续您可以根据自己的需要更换需要的模型、Lora、增加插件。
108 14
一键生成毛茸萌宠形象,基于函数计算极速部署ComfyUI生图系统
通过阿里云函数计算FC 和文件存储NAS,用户体验 ComfyUI 和预置工作流文件,用户可以快速生成毛茸茸萌宠等高质量图像。
一键生成毛茸萌宠形象,基于函数计算极速部署ComfyUI生图系统
函数计算助您 7 分钟极速部署开源对话大模型
本方案利用函数计算的无服务器架构,您可以在函数计算控制台选择魔搭(ModelScope)开源大模型应用模板;同时,我们将利用文件存储 NAS ,为应用服务所需的大模型和相关文件提供一个安全的存储环境;最终通过访问提供的域名进行模型的调用与验证。仅需三步,即可玩转目前热门 AI 大模型。
7分钟玩转 AI 应用,函数计算一键部署 AI 生图大模型
人工智能生成图像(AI 生图)的领域中,Stable Diffusion WebUI 以其强大的算法和稳定的输出质量而闻名。它能够快速地从文本描述中生成高质量的图像,为用户提供了一个直观且高效的创作平台。而 ComfyUI 则以其用户友好的界面和高度定制化的选项所受到欢迎。ComfyUI 的灵活性和直观性使得即使是没有技术背景的用户也能轻松上手。本次技术解决方案通过函数计算一键部署热门 AI 生图大模型,凭借其按量付费、卓越弹性、快速交付能力的特点,完美实现低成本,免运维。
活动实践 | 西游再现,函数计算一键部署 Flux 超写实文生图模型部署
这些图片展示了阿里巴巴云开发者生态的多个方面,包括开发工具、技术文档、社区交流、培训认证等内容,旨在为开发者提供全方位的支持和服务。

相关产品

  • 函数计算
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等