首先,xblock是一个模块,edx即edx-platform,在github.com/edx/edx-platform中,此平台有一个专门加载xblock的模块,定义了所有的接口,可以逐一将模块中的所有信息传递到平台中,严格来说应该是将整个xblock的数据导入到web端.通过web应用,通常是nginx这种,基于python的djangoWeb框架来进行后端xblock的开发.

Edx-platform是完整的edx组件,以及开发环境,在进行open-edx开发是还需要三个环境,git,python和python virtualenv,python virtualenv是因为edx目前的版本只支持python2.7而archive库版本已经是python3了,如果本地python版本与edx一致那么是不需要virtualenv的,其作用是模拟一个环境,python2和python3都可以运行.

xblock是一个相对前端的组件,实际上整个edx都是django来开发的,某种意义上edx是一个纯粹的web应用.Edx还提供了一套快速开发xblock的工具,称为xblock-sdk

xblock的主要模块分以下几个:(以加载一个视频及其附加模块为例)

1.init.py    其实就是加载所有的python模块,从这些模块中导入关键的类和函数.

2.setup.py

主要功能是加载一个xblock,安装,注册.

workbench会调用workbench_senario()来注册这个xblock,在xblock模块这个文件夹目录下,setup.py应注册如下几个属性:

 setup(
name='videoblock',
version='0.1',
description='yourdescription',
py_modules=['nameofyourxblock'],
install_requires=['XBlock'],
entry_points={
'xblock.v1': [
nameofyourxblock = nameofyourxblock:theclassofyourxblock',
]
}
)

其中关键是nameofyourxblock和the class

这样一个py文件就写好了,如果在后面的python文件中定义了workbench的话,setup.py会自动加载

3.yourxblock.py,一般在xblock文件夹下面,存放requirement.txt以及setup.py,还需要另外命名一个文件夹成为yourxblock.py,注意,文件夹的名字,要跟调用的文件夹路径相同,init.py也要包含进这个文件夹里面,在此文件夹内,还有一个文件夹名为static,里面是关于前端的部分,如html,css,javascript等,用来修饰增强xblock的功能,因为本质上edx xblock是前端的web框架编写的

这个python文件一般如下:

import pkg_resources
import requests from urlparse import urlparse from xblock.core import XBlock
from xblock.fields import Scope, Integer, String
from xblock.fragment import Fragment class classofyourxblock(XBlock)://xblock类的名称
attribute1=type1;//String(help="URL of the video page at the provider", default=None, scope=Scope.content)//属性,如整数,字符串,等
attribute2=type2;//Integer(help="The number of times the student watched the video", default=0, scope=Scope.user_state)
...
def student_view(self, context): //学生端的框架编写
provider, embed_code = self.get_embed_code_for_url(self.attribute1)//provider是外部引用的URL,如youku,tudou等等,此函数从某个attribute提供的信息返回一个列表,包括提供商
以及要嵌入的媒体内容 # Load the HTML fragment from within the package and fill in the template
html_str = pkg_resources.resource_string(__name__, "static/html/nameofyourxblock.html")
frag = Fragment(unicode(html_str).format(self=self, embed_code=embed_code)) # Load CSS
css_str = pkg_resources.resource_string(__name__, "static/css/simplevideo.css")
frag.add_css(unicode(css_str)) # Load JS
if provider == 'URL of video'://如果PROVIDER是某个provider
frag.add_javascript_url("video javascript")//这里的video javascript是指服务提供商自己开发的接口所提供的js库
js_str = pkg_resources.resource_string(__name__, "static/js/nameofyourxblock.js")
frag.add_javascript(unicode(js_str))
frag.initialize_js('classofyouxblock') return frag //frag是整个xblock的核心,能够加载html,css,js等前端文件,以及从外部媒体提供商获取媒体流
def get_embed_code_for_url(self, url): //这个函数是获取媒体流的核心,通过外部提供的api,json接口,获取一些属性,为class中的attribute赋值 hostname = url and urlparse(url).hostname
params = {
'url': url,
'format': 'json',
'attribute1': self.attribute1,
'attribute2': self.attribute2
} if hostname == 'URL':
oembed_url = 'the json of provider'
params['api'] = True
else:
return hostname, '<p>Unsupported video provider ({0})</p>'.format(hostname) try:
r = requests.get(oembed_url, params=params)
r.raise_for_status()
except Exception as e:
return hostname, '<p>Error getting video from provider ({error})</p>'.format(error=e)
response = r.json() return hostname, response['html'] @XBlock.json_handler //装饰器,定义在edx-platform中
def mark_as_watched(self, data, suffix=''): //这里是一个投票的函数,当xblock被访问一次,此计数值加一,是json的一个句柄
if data.get('watched'):
self.watched_count += 1 return {'watched_count': self.watched_count} @staticmethod //工作台负责加载整个页面模式以及xblock相对位置的,也是整个xblock的核心
def workbench_scenarios():
return [ //从垂直方向定义了xblock的位置,可以在其中嵌入更多的xblock,也可以在其中嵌入一些前端的内容
("nameofyourxblock",
"""\
<vertical_demo>
<nameofyourxblock attribute1=.. attribute2=... />
<html_demo><div>the module you want to add in html</div></html_demo>
other xblock1
other xblock2
...
</vertical_demo>
""")
] //至此,一个视频的xblock就完成了

4.static/html,css,javascript,这些就是个人自定义的内容了,笔者对前端完全不懂因此不在此讨论,在这些前端文件中,可以控制xblock的表现形式,另外要说的是,获取媒体流的html文件,必须把embed_code在html中声明,否则无法获取媒体流

xblock的加载:python  manage.py  runserver

然后在localhost:8000端口可以看到被加载的 xblock

xblock架构,链接与加载的更多相关文章

  1. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  2. 深入理解LINUX下动态库链接器/加载器ld-linux.so.2

    [ld-linux-x86-64.so.2] 最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜 ...

  3. iOS “请在微信客户端打开链接” UIWebview加载H5页面携带session、cookie、User-Agent信息 设置cookie、清除cookie、设置User-Agent

    公司新开的一个项目..内容基本上是加载H5页面显示..当时觉得挺简单的..后来发现自己掉坑里了..一些心理历程就不说了..说这个项目主要用到的知识点吧..也是自己踩得坑. 首先说说..这个项目上的内容 ...

  4. MySQL逻辑架构、SQL加载执行顺序、七种JOIN模式图解

    逻辑架构   存储引擎 查看当前安装的mysql提供的存储引擎 查看当前mysql默认的存储引擎 MyISAM和InnoDB SQL加载执行顺序 sql书写顺序 mysql解析器执行的顺序  考点:m ...

  5. wordpress禁止调用官方Gravatar头像调用ssl头像链接提升加载速度

    在主题中的functions.php文件末尾加上以下代码即可(外观>编辑>functions.php) //官方Gravatar头像调用ssl头像链接 function get_ssl_a ...

  6. ld.so和ld-linux.so* :动态链接器/加载器(转)

    概述 动态链接器可以被正在运行的动态链接程序或者动态对象(没有对动态链接器指定命令选项,动态链接器被存储在程序的.interp区域)间接调用,也可以直接运行程序, 例如:/lib/ld-linux.s ...

  7. C编译器、链接器、加载器详解

    摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代 ...

  8. Linux下显示运行时链接(运行时加载)

    目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dler ...

  9. bootrom/spl/uboot/linux逐级加载是如何实现的?

    关键词:bootrom.spl.uboot.linux.mksheader.sb_header.mkimage.image_header_t等等. 首先看一个典型的bootrom->spl-&g ...

随机推荐

  1. 【leetcode】1047. Remove All Adjacent Duplicates In String

    题目如下: Given a string S of lowercase letters, a duplicate removal consists of choosing two adjacent a ...

  2. USACO 2006 November Gold Corn Fields

    USACO 2006 November Gold Corn Fields 题目描述: Farmer John has purchased a lush new rectangular pasture ...

  3. dos编辑文件上传到unix系统多余^M删除方法

    linux上的文件sz到window编辑后多出^M, 方法一: 1.grep -anR '^M' filename |wc -l2.crontab -e 或vim filename3.:set ff  ...

  4. 去掉xcode中警告的一些经验

    1.编译时,编译警告忽略掉某些文件 只需在在文件的Compiler Flags 中加入 -w 参数,例如: 2.编译时,编译警告忽略掉某段代码 #pragma clang diagnostic pus ...

  5. centos环境下安装java环境

    1-上java官网下载rpm安装包 jdk-7u80-linux-i586.rpm 2-新建文件夹,并把jdk-7u80-linux-i586.rpm上传到此文件夹下面 cd /usr/local/ ...

  6. 关于线段树or 树状树状 在二维平面搞事情!Orz

    第一式:https://ac.nowcoder.com/acm/contest/143/I 题意: 有 n 个点,一个点集 S 是好的,当且仅当对于他的每个子集 T,存在一个右边无限长的矩形,使得这个 ...

  7. composer proc_open(): fork failed – Cannot allocate memory

    一般小的VPS 才1G内存,如果使用composer会提示内存不足的现象 解决办法,可以使用交换内存 直接命令 /bin/dd if=/dev/zero of=/var/swap.1 bs=1M co ...

  8. jQuery file upload测试

    <input id="fileupload" type="file" name="files[]" data-url="Ha ...

  9. QQ空间分享网址

    现在大部分网站都在每个界面设计了分享这个功能,但还是有的网页没有(比如 B 站只能分享具体的视频).在原来的 QQ 空间分享的地方已经找不到法自己创建分享.上网一搜有分享的接口,可这个接口是给开发者用 ...

  10. C# 做延迟,但系统又能同时能执行其它任务

    private void Delay(int Millisecond) //使用时直接调用即可 { DateTime current = DateTime.Now; while (current.Ad ...