xblock架构,链接与加载
首先,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架构,链接与加载的更多相关文章
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- 深入理解LINUX下动态库链接器/加载器ld-linux.so.2
[ld-linux-x86-64.so.2] 最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜 ...
- iOS “请在微信客户端打开链接” UIWebview加载H5页面携带session、cookie、User-Agent信息 设置cookie、清除cookie、设置User-Agent
公司新开的一个项目..内容基本上是加载H5页面显示..当时觉得挺简单的..后来发现自己掉坑里了..一些心理历程就不说了..说这个项目主要用到的知识点吧..也是自己踩得坑. 首先说说..这个项目上的内容 ...
- MySQL逻辑架构、SQL加载执行顺序、七种JOIN模式图解
逻辑架构 存储引擎 查看当前安装的mysql提供的存储引擎 查看当前mysql默认的存储引擎 MyISAM和InnoDB SQL加载执行顺序 sql书写顺序 mysql解析器执行的顺序 考点:m ...
- wordpress禁止调用官方Gravatar头像调用ssl头像链接提升加载速度
在主题中的functions.php文件末尾加上以下代码即可(外观>编辑>functions.php) //官方Gravatar头像调用ssl头像链接 function get_ssl_a ...
- ld.so和ld-linux.so* :动态链接器/加载器(转)
概述 动态链接器可以被正在运行的动态链接程序或者动态对象(没有对动态链接器指定命令选项,动态链接器被存储在程序的.interp区域)间接调用,也可以直接运行程序, 例如:/lib/ld-linux.s ...
- C编译器、链接器、加载器详解
摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代 ...
- Linux下显示运行时链接(运行时加载)
目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dler ...
- bootrom/spl/uboot/linux逐级加载是如何实现的?
关键词:bootrom.spl.uboot.linux.mksheader.sb_header.mkimage.image_header_t等等. 首先看一个典型的bootrom->spl-&g ...
随机推荐
- LeetCode--051--N皇后(java)-star
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案. 每一种解 ...
- 正则化的L1范数和L2范数
范数介绍:https://www.zhihu.com/question/20473040?utm_campaign=rss&utm_medium=rss&utm_source=rss& ...
- 021:自定义path(或url)转换器
1.实现如下需求:用户可以根据articles/list/方式获取文章,其中文章分类是采用如下分类,实例如下: 第一种:获取python分类下的文章:/article/python/ 第二种:获取py ...
- github上拉去代码执行 npm install报错code:128
npm ERR! code npm ERR! Command failed: D:\Program Files\Git\cmd\git.EXE clone --mirror -q git://gith ...
- python-数据驱动
1.parameterized.parameterized import unittest from parameterized import parameterized,param class Te ...
- ThreadLocal学习资料
下面的这一段代码运行起来,就会发生线程安全问题: 启动两个线程,同时去修改 name 属性值. package com.liwei.thread; /** * 下面的代码演示了线程安全发生的由来 * ...
- 【easyui-combobox】下拉菜单自动补全功能,Ajax获取远程数据源
这个是针对easyUI的下拉菜单使用的,Ajax获取远程数据源 HTML 页面 <input id="uname" name="uname" class= ...
- 牛客:t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数(数论+贪心)
https://ac.nowcoder.com/acm/contest/907/B t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数 分析: 根据约数和定理:对于一个大于1正整数 ...
- thinkphp 级联菜单实现
养殖场->栋舍级联菜单 //获取默认养殖场和栋舍信息 public function sbjr(){ $yzc_model=M("Yzc"); $list = $yzc_mo ...
- 【Visual Studio】 使用EF、 Linq2Sql快速创建数据交互层(一)
项目伊始,创建数据库交互层代码是底层框架的首要任务.常用的做法包括手动编码.Hibernate或者动软之类的代码生成器,而多数人忽略了.Net环境下VS提供的两套非常好用的数据层工具. EF和Linq ...