django web项目部署到阿里云函数计算平台

简介: django web项目部署到阿里云函数计算平台   阿里云函数计算(FC),旨在帮助用户采用弹性伸缩、动态分配资源的方式,来执行业务逻辑.让用户无需购买部署服务器,无需考虑业务负载,就能快速搭建可处理高并发的后台服务.   基于WSGI标准的项目能够很方便的迁移至函数计算平台. 本文介绍如何将一个通用的django web项目,通过FC提供的fun命令行工具快速部署到FC平台。

阿里云函数计算平台

  阿里云函数计算(FC),旨在帮助用户采用弹性伸缩、动态分配资源的方式,来执行业务逻辑.让用户无需购买部署服务器,无需考虑业务负载,就能快速搭建可处理高并发的后台服务.

  基于WSGI标准的项目能够很方便的迁移至函数计算平台. 本文介绍如何将一个通用的django web项目,通过FC提供的fun命令行工具快速部署到FC平台。

1. django web项目预览
  示例项目是一个简单的值班oncall系统,按照人员列表已一周为周期排班,并支持钉钉群发消息推送.
django项目目录结构:
  ed5d163da15cc67347bf17eb896e755be07e2886


2. 部署到函数计算平台

  • 2.1 在项目目录安装依赖库(很重要)
      FC平台上函数的运行环境对不同语言都有部分默认支持的三方库可直接使用,请参考:函数计算python运行环境文档

  对于其他的依赖库,用户需自行安装在项目目录,发布时fun工具会将这些库以及用户代码一并打包上传到FC平台. 示例中需要安装django以及数据库工具pymsql

  • 安装django

    pip install -t . django
  • 安装pymysql

    pip install -t . pymysql

    django中python2.7使用pymysql, 必须先修改下安装为MySQLdb:
    d9537162bd4a86d8367b2b70a0d630af8337fa9b
    安装完成后项目目录结构:
    2b3fad05ed3709fcbf65a5e12def59e4bbc9fdb5


  • 2.2 设置静态资源路径
    为了让系统在FC上运行时,能找到对应的静态资源文件(js/css),必须先修改配置下静态资源路径
  • 修改settings.py
    c07b6f49881186139e99917b08a483dbf0bd35ac

      STATIC_URL = '/static/'
      # STATICFILES_DIRS = [
      #     os.path.join(BASE_DIR, "static"),
      # ]
    
      STATIC_FC_URL = STATIC_URL
      STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  • 修改urls.py
    为上面配置的资源路径,设置url映射.

    from django.conf.urls import url
    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns += static(settings.STATIC_FC_URL, document_root=settings.STATIC_ROOT)
  • 修改静态页面中引用方式:
    7d19db98cfe7a21e4562632a70e258fef5a4eb89
    435147115206a882c71c5caf9dd2d2622a6161f1


  • 2.3 创建入口文件main.py

      # 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__)), "OnCallSys(改成你的工程目录)"))
      import django
    
      from django.conf import settings
      print (django.__version__)
    
      import urlparse
      from OnCallSys.wsgi import application
    
      base_path = None
    
      def handler(environ, start_response):
          request_uri = environ['fc.request_uri']
          parsed_tuple = urlparse.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)


  • 2.4 创建文件tick.py定时调用Oncall系统的/tick接口(非必要,只是OnCall系统的示例所需)

    # -*- coding: utf-8 -*-
    import logging
    import os
    import hashlib
    
    from OnCallSys.views.Util import Util
    
    def handler(event, context):
        print 'tick ...'
        url = os.environ['TICK_URL']
        name = os.environ['ADMIN_NAME']
        pwd = os.environ['ADMIN_PWD']
        pwd_md5 = hashlib.md5(pwd).hexdigest()
        url += '?username=' + name + '&pwd=' + pwd_md5
        print Util.http_get(url)


  • 2.5 编写FC fun工具的部署配置文件(保存到工程根目录)
  • .env文件

    DEFAULT_REGION=cn-hangzhou
    ACCOUNT_ID=
    ENDPOINT=
    ACCESS_KEY_ID=
    ACCESS_KEY_SECRET=
  • templates.yml

    ROSTemplateFormatVersion: '2015-09-01'       # 无需修改 
    Transform: 'Aliyun::Serverless-2018-04-03'   # 无需修改
    
    Resources:
    
      oncall-log:    # 创建logproject和logstore(需事先在阿里云平台开通日志服务)
        Type: 'Aliyun::Serverless::Log'
        Properties:
          Description: 'oncall system log'
    
        oncall-logstore:
          Type: 'Aliyun::Serverless::Log::Logstore'
          Properties:
              TTL: 362
              ShardCount: 1
    
      oncall-service:  # 1. 创建service, 名字随意取(可以理解为存放代码的包)
        Type: 'Aliyun::Serverless::Service'
        Properties:
          Description: 'oncall system'
          Policies:    # 设置权限
            - AliyunOSSFullAccess  # OSS[对象存储服务]权限(需事先在阿里云平台开通)
            - AliyunLogFullAccess  # log权限
    
          LogConfig:  # 配置项目的输出日志
            Project: oncall-log        # 上面创建的logproject
            Logstore: oncall-logstore  # 上面创建的logstore
    
          InternetAccess: true  # 设置项目代码是否能访问公网
    
        oncall:    # 2. 创建function, oncall函数对应本地的main.py文件
          Type: 'Aliyun::Serverless::Function'
          Properties:
            Handler: main.handler  # 入口函数main.py的handler函数
            CodeUri: './'
            Description: 'oncall system function'
            Runtime: python2.7
            Timeout: 60
            MemorySize: 512
            EnvironmentVariables:  # 函数oncall的环境变量, 可在本函数中读取, 并能够在控制台修改
              'CUSTOM_DB_NAME': ''
              'CUSTOM_DB_USER': 
              'CUSTOM_DB_PWD': 
              'CUSTOM_DB_HOST':
              'CUSTOM_DB_PORT': '3306'
              'WEB_HOOK_URL':
              'ONCALL_SYS_URL':
              'ADMIN_NAME':
              'ADMIN_PWD': 
              'TOKEN_EXPIRE':
    
          Events:           # 函数oncall的事件触发器, 这里web服务用的是http触发器
            http-trigger:   # trigger name
              Type: HTTP    # trigger type
              Properties:
                AuthType: ANONYMOUS   # 匿名访问
                Methods: ['GET', 'POST']
    
        tick:    # 创建function,tick函数(类似上面的oncall函数, 不需要可以不创建,只是示例所需)
          Type: 'Aliyun::Serverless::Function'
          Properties:
            Handler: tick.handler
            CodeUri: './'
            Description: 'oncall system tick function'
            Runtime: python2.7
            Timeout: 60
            MemorySize: 512
            EnvironmentVariables:
              'TICK_URL':           
              'ADMIN_NAME': 
              'ADMIN_PWD': 
    
          Events:
            tick-trigger:   # trigger name
              Type: Timer   # 定时触发器, 会根据以下cron表达式的规则定时触发当前函数
              Properties:
                  CronExpression: '0 0 1 ? * MON-FRI' # utc+8, 9:00 am, 周一到周五
                  Enable: true

    PS: yml文件对indent有严格要求,请注意各行代码的indent


  •  2.6 部署到FC函数计算
  • 在django工程根目录下执行

    fun deploy

    yunqi3.png
    部署成功!


  • 在阿里云FC控制台查看
    75755253f211501d2e4f46795e4818db8c25f0e6

  19921b8eb520f638211d0201563498e5f5767ccd


  • 使用测试
    yq4

在浏览器中输入复制的链接地址即可访问django项目中对应的web资源(页面或API)
6a25ad061a144b881437d19fe0f9f8c8f69cfa9d

到此,恭喜迁移成功!


问题解答
Q: 代码中怎么使用template.yml中配置的环境变量
A: 通过os.environ字典读取
931a14963042e818996d2142ae771c0d9bd965f6

Q: 本地测试时怎么设置环境变量
A: 可在settings.py中添加测试代码(部署时注释掉)
b86780f73d8b5f5bfcee78d552cfb8b1826ed338



相关链接:

  1. 阿里云函数计算使用文档
  2. FC fun工具安装
  3. FC fun工具使用部署文档

如果您有任何反馈或疑问,欢迎通过 阿里云聆听官方论坛云栖社区 联系我们。您也可以加入钉钉用户群(钉钉群号:11721331)与函数计算工程师即时沟通。
DingTalkSupport1

相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
存储 人工智能 Serverless
AI 短剧遇上函数计算,一键搭建内容创意平台
为了帮助更多内容创作者和企业快速实现 AI 短剧创作,函数计算 FC 联合百炼联合推出“AI 剧本生成与动画创作解决方案”,通过函数计算 FC 构建 Web 服务,结合百炼模型服务和 ComfyUI 生图平台,实现从故事剧本撰写、插图设计、声音合成和字幕添加到视频合成的一站式自动化流程。创作者只需通过简单操作,就能快速生成高质量的剧本,并一键转化为精美的动画。
1445 109
|
消息中间件 运维 安全
C5GAME 游戏饰品交易平台借助 RocketMQ Serverless 保障千万级玩家流畅体验
游戏行业蓬勃发展,作为国内领先的 STEAM 游戏饰品交易的服务平台,看 C5GAME 如何利用 RocketMQ Serverless 技术,为千万级玩家提供流畅的游戏体验,同时降低成本并提升运维效率。
1293 153
C5GAME 游戏饰品交易平台借助 RocketMQ Serverless 保障千万级玩家流畅体验
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
1158 157
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
673 1
|
人工智能 运维 安全
阿里云 Serverless 助力海牙湾构建弹性、高效、智能的 AI 数字化平台
海牙湾(G-Town)是一家以“供应链+场景+技术+AI”为核心驱动力的科技公司,致力于为各行业提供数字化转型解决方案。通过采用阿里云Serverless架构,解决了弹性能力不足、资源浪费与运维低效的问题。SAE全托管特性降低了技术复杂度,并计划进一步探索Serverless与AI结合,推动智能数字化发展。海牙湾业务覆盖金融、美妆、能源等领域,与多家知名企业建立战略合作,持续优化用户体验和供应链决策能力,保障信息安全并创造可量化的商业价值。未来,公司将深化云原生技术应用,助力更多行业实现高效数字化转型。
920 19
|
运维 Cloud Native Serverless
Serverless Argo Workflows大规模计算工作流平台荣获信通院“云原生技术创新标杆案例”
2024年12月24日,阿里云Serverless Argo Workflows大规模计算工作流平台荣获由中国信息通信研究院颁发的「云原生技术创新案例」奖。
|
存储 人工智能 Serverless
AI 短剧遇上函数计算,一键搭建内容创意平台
AI 短剧遇上函数计算,一键搭建内容创意平台
401 0
|
API 数据库 开发者
深度剖析Django/Flask:解锁Web开发新姿势,让创意无限延伸!
在Web开发领域,Django与Flask如同两颗璀璨的星辰,各具特色。Django提供全栈解决方案,适合快速开发复杂应用;Flask则轻量灵活,适合小型项目和API开发。本文通过问答形式,深入解析两大框架的使用方法和选择策略,助你解锁Web开发新技能。
301 2
|
Web App开发 移动开发 JavaScript
开放的Web平台才是是我们想要的——HTML5变为HTML
     昨晚WHATWG宣布了一条重大消息——HTML5变为HTML。  他们发布的文章标题是:HTML is the new HTML5,什么意思呢?它的依据是,实际应用中的HTML和JavaScript在很多方面都在不断的进步,时刻都在变化,HTML5这个名称已经没有什么实际意义了,这意味着这份规范将发布更少的版本,取而代之的将是一个活的标准,将随着不断发展的新技术而自动调整。
918 0
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
645 4

相关产品

  • 函数计算