首先,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. Java 13 在win10 安装及配置

    java 13 SDK 下载 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538 ...

  2. [洛谷P3145] CQOI2009 循环赛

    问题描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入格式 第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分. 输出格式 ...

  3. intraweb首次与LayUI结合

    intraweb可以说是Delphi Web开发的好帮手,但是自带的控件搭建页面,感觉不是那么美观,于是想引用一个UI框架,Delphi来提供后台访问,但是发现一个问题,如果intraweb用模版,L ...

  4. Cluster基础(五):配置tracker、配置storage、文件测试及web访问

    一.配置tracker 目标: FastDFS是一个分布式文件系统,主要的服务器角色有Tracker和Storage.本例安装一台Tracker,实现以下功能: 接受客户端的访问 检索存储节点,为客户 ...

  5. js+html实现玫瑰花绽放

    玫瑰花示例demo: <!DOCTYPE html> <html> <head> <title>玫瑰花</title> <meta c ...

  6. rssi pdf 单双峰正态发布 与 定位

  7. day20—CSS中伪类:before与:after的应用:

    转行学开发,代码100天——2018-04-05 CSS中的两个伪类:before和:after适合应用与在元素的开始或者结尾处添加修饰性文字或外观,实现内容添加的同时并没有破坏HTML代码 语义.如 ...

  8. 【大前端攻城狮之路·二】Javascript&QA⼯程师

    今天给大家分享的主题的是Javascript&QA⼯程师.看到这个主题,可能有人问:前端开发完就OK了,剩下的丢给测试就行,哪里还需要关心这些?但事实上呢,测试是前端开发非常重要的环节,也是迈 ...

  9. OSPF多区域配置;骨干区域与非骨干区域;ABR边界路由器;LSA和SPF算法

    SPF:链路状态路由算法.基本用于OSPF中,但是要求路由器路由数据库足够大,因为链路状态信息包括很多内容,这也是一个缺点. OSPF是一种内部网关协议(IGP) OSPF路由协议是一种典型的链路状态 ...

  10. opencv部署服务器报错

    报错内容: ImportError: libSM.so.6: cannot open shared object file: No such file or directory 解决办法: sudo ...