有时,自定义模板标签创建的基本功能是不够的。 别担心,Django可以让您完全访问从底层构建模板标签所需的内部组件。
快速概览
模板系统分两个步骤进行:编译和渲染。 要定义自定义模板标签,您需要指定编译的工作方式以及渲染的工作方式。 当Django编译模板时,它将原始模板文本分割成“节点”。 每个节点是django.template.Node的一个实例,并有一个render()方法。 编译好的模板就是一个Node对象列表。
当您在编译模板对象上调用render()时,模板将使用给定的上下文在其节点列表中的每个节点上调用render()。 结果全部连接在一起形成模板的输出。 因此,要定义一个自定义模板标签,可以指定原始模板标签如何转换为一个Node(编译函数),以及节点的render()方法。
编写函数
对于模板解析器遇到的每个模板标签,它都会调用带有标签内容和解析器对象本身的Python函数。 这个函数负责根据标签的内容返回一个Node实例。 例如,让我们编写一个完整的简单模板标签{%current_time%}的实现,它以strftime()语法显示当前日期/时间,根据标签中给定的参数进行格式化。 在别的之前决定标签语法是个好主意。 在我们的例子中,让我们说标签应该像这样使用:
The time is {% current_time "%Y-%m-%d %I:%M %p" %}.
这个函数的解析器应该获取参数并创建一个Node对象:
from django import template
def do_current_time(parser, token):
try:
tag_name, format_string = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError("%r tag requires a single argument"
% token.contents.split()[0])
if not (format_string[0] == format_string[-1] and format_string[0] in ('"', "'")):
raise template.TemplateSyntaxError("%r tag's argument should be in quotes" % \
tag_name)
return CurrentTimeNode(format_string[1:-1])
笔记:
解析器是模板解析器对象。在这个例子中,我们不需要它。
token.contents是标记的原始内容的字符串。在我们的例子中,它是'current_time'%Y-%m-%d%I:%M%p“'。
token.split_contents()方法将空格上的参数分隔开,同时将引用的字符串保留在一起。更直接的token.contents.split()将不会像所有空格(包括引用字符串中的空格)那样天真地分割。总是使用token.split_contents()是个好主意。
这个函数负责提升django.template.TemplateSyntaxError,有帮助的消息,用于任何语法错误。
TemplateSyntaxError异常使用tag_name变量。不要在错误信息中对标签名称进行硬编码,因为这会将标签的名称与您的功能相结合。 token.contents.split()[0]将“始终”作为你的标签的名字 - 即使标签没有参数。
该函数返回一个CurrentTimeNode,节点需要知道这个标签的所有内容。在这种情况下,它只是传递参数 - “%Y-%m-%d%I:%M%p”。在format_string [1:-1]中删除模板标签中的前导和尾部引号。
解析是非常低级的。 Django开发人员已经尝试过使用EBNF语法之类的技术在这个解析系统之上编写小型框架,但是这些实验使得模板引擎太慢了。这是低级的,因为这是最快的。
编写渲染器
编写自定义标签的第二步是定义一个具有render()方法的Node子类。 继续上面的例子,我们需要定义CurrentTimeNode:
import datetime
from django import template
class CurrentTimeNode(template.Node):
def __init__(self, format_string):
self.format_string = format_string
def render(self, context):
return datetime.datetime.now().strftime(self.format_string)
__init __()从do_current_time()获取format_string。 总是通过其__init __()将任何选项/参数/参数传递给节点。
render()方法是工作实际发生的地方。
render()通常应该默默地失败,特别是在DEBUG的生产环境中 和TEMPLATE_DEBUG都是False。 但是,在某些情况下,特别是如果TEMPLATE_DEBUG为True,则此方法可能会引发异常,从而使调试变得更容易。 例如,如果几个核心标记接收到错误的参数数量或类型,则会引发django.template.TemplateSyntaxError。 最终,编译和渲染的解耦会产生一个高效的模板系统,因为模板可以渲染多个上下文而不必多次分析。
自动转义注意事项
模板标签的输出不会通过自动转义过滤器自动运行。 但是,在编写模板标签时,还是应该记住一些事情。 如果模板的render()函数将结果存储在上下文变量中(而不是以字符串形式返回结果),则应该小心地在适当的时候调用mark_safe()。 当变量最终呈现时,它将受到当时有效的自动转义设置的影响,所以应该安全避免进一步转义的内容需要被标记为这样。
另外,如果您的模板标签为执行某个子呈现创建了一个新的上下文,请将auto-escape属性设置为当前上下文的值。 Context类的init 方法需要一个名为autoescape的参数,您可以使用这个参数。 例如:
from django.template import Context
def render(self, context):
# ...
new_context = Context({'var': obj}, autoescape=context.autoescape)
# ... Do something with new_context ...
这不是一个很常见的情况,但是如果你自己渲染一个模板,这是非常有用的。 例如:
def render(self, context):
t = context.template.engine.get_template('small_fragment.html')
return t.render(Context({'var': obj}, autoescape=context.autoescape))
如果我们在本例中忽略了将当前的context.autoescape值传递给我们的新的Context,结果总是会被自动转义,如果模板标签被用在{%autoescape off% }块。
线程安全考虑
一旦节点被解析,其渲染方法可以被调用任意次数。 由于Django有时在多线程环境中运行,单个节点可能会同时呈现不同的上下文以响应两个单独的请求。
因此,确保您的模板标签是线程安全的是非常重要的。 为了确保你的模板标签是线程安全的,你不应该在节点上存储状态信息。 例如, Django提供了一个内置的循环模板标签,它在每次渲染时在给定字符串列表中循环显示:
{% for o in some_list %}
如果你忽略名称参数,就像上面的第二个例子一样,Django将使用该函数的名字作为标签名称。
将模板变量传递给标签
虽然可以使用token.split_contents()将任意数量的参数传递给模板标记,但参数都将解压缩为字符串文本。 为了将动态内容(模板变量)作为参数传递给模板标签,需要做更多的工作。
虽然前面的例子已经把当前时间格式化为一个字符串并且返回了字符串,但是假设你想从一个对象传递一个DateTimeField并且使用date-time的模板标签格式:
This post was last updated at {% format_time blog_entry.date_updated "%Y-%m-%d %I:\
%M %p" %}.
最初,token.split_contents()将返回三个值:
标签名称format_time。
字符串“blog_entry.date_updated”(不包括周围的引号)。
格式化字符串'“%Y-%m-%d%I:%M%p”'。 split_contents()的返回值将包括像这样的字符串文本的前导和尾随引号。
现在你的标签应该看起来像这样:
from django import template
def do_format_time(parser, token):
try:
# split_contents() knows not to split quoted strings.
tag_name, date_to_be_formatted, format_string =
token.split_contents()
except ValueError:
raise template.TemplateSyntaxError("%r tag requires exactly
two arguments" % token.contents.split()[0])
if not (format_string[0] == format_string[-1] and
format_string[0] in ('"', "'")):
raise template.TemplateSyntaxError("%r tag's argument should
be in quotes" % tag_name)
return FormatTimeNode(date_to_be_formatted, format_string[1:-1])
您还必须更改渲染器以检索blog_entry对象的date_updated属性的实际内容。 这可以通过使用django.template中的Variable()类来完成。
要使用Variable类,只需使用要解析的变量的名称进行实例化,然后调用variable.resolve(context)。 所以,例如:
class FormatTimeNode(template.Node):
def __init__(self, date_to_be_formatted, format_string):
self.date_to_be_formatted =
template.Variable(date_to_be_formatted)
self.format_string = format_string
def render(self, context):
try:
actual_date = self.date_to_be_formatted.resolve(context)
return actual_date.strftime(self.format_string)
except template.VariableDoesNotExist:
return ''
如果变量解析无法解析在页面的当前上下文中传递给它的字符串,则会抛出VariableDoesNotExist异常。
在上下文中设置变量
上面的例子只是输出一个值。 一般来说,如果您的模板标签设置了模板变量而不是输出值,则更为灵活。 这样,模板作者可以重复使用模板标签创建的值。 要在上下文中设置变量,只需在render()方法的上下文对象上使用字典赋值。 以下是CurrentTimeNode的更新版本,它设置模板变量current_time而不是输出:
import datetime
from django import template
class CurrentTimeNode2(template.Node):
def __init__(self, format_string):
self.format_string = format_string
def render(self, context):
context['current_time'] =
datetime.datetime.now().strftime(self.format_string)
return ''
请注意,render()返回空字符串。 render()应该总是返回字符串输出。 如果所有模板标签都设置了一个变量,那么render()应该返回空字符串。 以下是如何使用这个新版本的标签:
{% current_time "%Y-%M-%d %I:%M %p" %}
The time is {{ current_time }}.
上下文中的变量范围
在上下文中设置的任何变量只能在分配模板的相同块中使用。 这种行为是故意的; 它为变量提供了一个范围,以便它们不会与其他块中的上下文发生冲突。
但是,CurrentTimeNode2存在问题:变量名称current_time是硬编码的。 这意味着您需要确保您的模板不会在其他任何地方使用{{current_time}},因为{%current_time%}将盲目地覆盖该变量的值。
一个更清洁的解决方案是使模板标签指定输出变量的名称,如下所示:
{% current_time "%Y-%M-%d %I:%M %p" as my_current_time %}
The current time is {{ my_current_time }}.
为此,您需要重构编译函数和节点 类,如下所示:
import re
class CurrentTimeNode3(template.Node):
def __init__(self, format_string, var_name):
self.format_string = format_string
self.var_name = var_name
def render(self, context):
context[self.var_name] =
datetime.datetime.now().strftime(self.format_string)
return ''
def do_current_time(parser, token):
# This version uses a regular expression to parse tag contents.
try:
# Splitting by None == splitting by spaces.
tag_name, arg = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError("%r tag requires arguments"
% token.contents.split()[0])
m = re.search(r'(.*?) as (\w+)', arg)
if not m:
raise template.TemplateSyntaxError("%r tag had invalid arguments" % tag_name)
format_string, var_name = m.groups()
if not (format_string[0] == format_string[-1] and format_string[0] in ('"', "'")):
raise template.TemplateSyntaxError("%r tag's argument should be in quotes" % \
tag_name)
return CurrentTimeNode3(format_string[1:-1], var_name)
这里的区别是,do_current_time()获取格式字符串和变量名称,同时传递给CurrentTimeNode3。 最后,如果您只需要为自定义上下文更新模板标签使用简单的语法,则可能需要考虑使用上面介绍的分配标签快捷方式。
解析到另一个块标记
模板标签可以协同工作。 例如,标准的{%comment%}标签隐藏了一切,直到{%endcomment%}。 要创建一个如此的模板标签,请在编译函数中使用parser.parse()。 以下是如何实现简化的{%comment%}标记:
def do_comment(parser, token):
nodelist = parser.parse(('endcomment',))
parser.delete_first_token()
return CommentNode()
class CommentNode(template.Node):
def render(self, context):
return ''
{%comment%}的实际实现略有不同,因为它允许在{%comment%}和{%endcomment%}之间出现损坏的模板标记。 它通过调用parser.skip_past('endcomment')而不是parser.parse(('endcomment',)),接着parser.delete_first_token()来实现,从而避免生成节点列表。
parser.parse()采用块标签名称的元组来解析,直到“”。 它返回一个django.template.NodeList的实例,该实例是解析器在遇到任何在元组中命名的标记之前遇到的所有Node对象的列表。 在上面的例子中,“nodelist = parser.parse(('endcomment',))”中,nodelist是{%comment%}和{%endcomment%}之间所有节点的列表,不包括{%comment%}和 {%endcomment%}自己。
在调用parser.parse()之后,解析器还没有“消费”{%endcomment%}标记,因此代码需要显式调用parser.delete_first_token()。 CommentNode.render()只是返回一个空字符串。 {%comment%}和{%endcomment%}之间的任何内容都会被忽略。
解析到另一个块标记,并保存内容
在前面的例子中,do_comment()放弃了{%comment%}和{%endcomment%}之间的所有内容。 而不是这样做,可以用块标签之间的代码做一些事情。 例如,以下是一个自定义模板标记{%upper%},它将自身和{%endupper%}之间的所有内容都大写。 用法:
{% upper %}This will appear in uppercase, {{ your_name }}.{% endupper %}
和前面的例子一样,我们将使用parser.parse()。 但是这一次,我们将生成的节点列表传递给Node:
def do_upper(parser, token):
nodelist = parser.parse(('endupper',))
parser.delete_first_token()
return UpperNode(nodelist)
class UpperNode(template.Node):
def __init__(self, nodelist):
self.nodelist = nodelist
def render(self, context):
output = self.nodelist.render(context)
return output.upper()
这里唯一的新概念是UpperNode.render()中的self.nodelist.render(context)。 有关复杂渲染的更多示例,请参阅django / template / defaulttags.py中的{%for%}的源代码 和django / template / smartif.py中的{%if%}。
下一步是什么
继续本节的高级主题,下一章将介绍Django模型的高级用法。
你可能感兴趣的:(高级自定义模板标签)
深入解析美团外卖Flutter-架构演进之路(上篇),2021Android研发必问高级面试题
m0_65321095
程序员 架构 移动开发 android
全局变量和静态成员变量,这些变量不会在热刷新时更新。修改了main函数中创建的根控件节点,Flutter在热刷新后只会根据原来的根节点重新创建控件树,不会修改根节点。某个类从普通类型转换成枚举类型,或者类型的泛型参数列表变化,都会使人刷新失败。热刷新无法实现更新时,执行一次热重启(HotRestart)就可以全量更新所有代码,同样不需要重启App,区别是restart会将所有Dart代码打包同步到
如何训练LLM“思考”(像o1和DeepSeek-R1一样, 高级推理模型解析
果冻人工智能
AI员工 人工智能 chatgpt 深度学习
2024年9月,OpenAI发布了它的o1模型,该模型基于大规模强化学习训练,赋予了它“高级推理”能力。不幸的是,他们是如何做到这一点的细节从未被公开披露。然而,今天,DeepSeek(一个AI研究实验室)成功复现了这种推理行为,并公开了他们方法的完整技术细节。在这篇文章中,我将讨论这一创新背后的关键思想,并描述它们在底层是如何运作的。一台会思考的笔记本电脑OpenAI的o1模型标志着训练大语言模
iOS 中使用 FFmpeg 的高级功能 - 滤镜(Filters)
陈皮话梅糖@
FFmpeg音视频高阶技术讲解 ios ffmpeg
FFmpeg提供了强大的滤镜功能,可以对音视频进行各种处理,例如裁剪、缩放、添加水印、调整颜色、添加特效等。1.FFmpeg滤镜基础知识1.1什么是滤镜(Filters)?滤镜是FFmpeg提供的一种功能,用于对音视频流进行处理。滤镜链(FilterChain)是多个滤镜的组合,按顺序对输入流进行处理。滤镜图(FilterGraph)是一个复杂的滤镜链,可以包含多个输入和输出。1.2常见的滤镜滤镜
【Elasticsearch】多索引(数据流)搜索
risc123456
Elasticsearch elasticsearch
在Elasticsearch中,搜索多个数据流(datastreams)和索引(indices)是一个常见的操作,尤其是在处理大规模数据或跨多个数据源进行查询时。以下是关于如何使用查询来搜索多个数据流和索引的详细说明,包括方法、示例和一些高级特性。---1.为什么需要搜索多个数据流和索引?在实际应用中,数据可能会分散在多个索引或数据流中,例如:•日志数据按日期或服务类型分隔到不同的索引。•数据流用
高效知识管理与分类优化指南:从目录设计到实践应用
思考在马桶上
笔记 经验分享 其他 生活 学习方法 程序人生 职场和发展
摘要本文旨在帮助读者在信息爆炸时代构建高效的知识管理体系,提供了知识收藏目录、浏览器书签和电脑文件夹的优化分类方案。知识收藏目录方案包括工作与项目、记录与日常、知识管理等八大类,具有边界清晰、扩展灵活、贴合实际场景等优势。浏览器书签分类方案注重高频工具置顶、设置临时缓冲区和标签辅助管理。电脑文件夹分类方案按角色划分,实行项目制管理,通用层级不超过三层。文章还给出了使用建议,并展望了未来结合AI助手
如何提高网站在百度中的权重?
网硕互联的小客服
安全 windows linux 运维 服务器
要提高网站在百度搜索引擎中的权重,您可以考虑以下方法来优化网站:###提高网站在百度中的权重方法:1.**优化网站内容**:-提供高质量、有价值的内容,确保内容原创、相关性强,能够吸引用户访问并提供有用信息。2.**关键词优化**:-在网站内容中合理使用关键词,包括在标题、META标签、内容中等位置使用关键词,但避免过度堆砌关键词。3.**网站结构优化**:-确保网站结构清晰、易于导航,有良好的内
如何使用EchartS
前段技术人
echarts 前端 javascript
1.引入ECharts库你可以通过以下两种方式引入ECharts库:方法一:使用CDN在HTML文件的标签中添加以下代码:EChartsExample方法二:下载并本地引入你可以从ECharts官方网站下载ECharts的压缩包,解压后将echarts.min.js文件复制到你的项目目录中,然后在HTML文件中引入:EChartsExample2.创建DOM容器在HTML文件的标签中创建一个具有指
打造十六进制文本编辑器:从基础到高级功能
无形小手
本文还有配套的精品资源,点击获取简介:十六进制文本编辑器是一种用于查看和编辑文件原始二进制数据的工具,它在编程调试和数据分析中尤其有用。这类编辑器提供对CEdit控件的子类化支持,可以处理十六进制字符输入,并自动添加空格以提高可读性。通过子类化CEdit,开发者能够定制标准文本编辑器的行为,实现对输入的限制和自动格式化功能。本项目的实现需要深入了解WindowsAPI、MFC以及二进制数据处理,并
HTML CSS整理笔记(建议收藏)
程序员的生活1
js web前端 html+css css javascript html css3
点击链接后退页面:回到上一个网页——修改placeholder提示的样式:打造全网web前端全栈资料库(总目录)看完学的更快,掌握的更加牢固,你值得拥有(持续更新)1.除IE外通用写法类名或标签名::placeholder{color:red;}2.加兼容前缀写法css超出一行显示省略号:给定宽度(width:100px)、超出隐藏(overflow:hidden)、强制在同一行显示(white-
一些我不知道的HTML前端基础知识笔记
han1140521792
学习资料 HTML5 CSS JavaScript
点击链接后退页面:回到上一个网页——修改placeholder提示的样式:1.除IE外通用写法类名或标签名::placeholder{color:red;}2.加兼容前缀写法css超出一行显示省略号:给定宽度(width:100px)、超出隐藏(overflow:hidden)、强制在同一行显示(white-space:nowrap)、省略号(text-overflow:ellipsis)——常见
Vue 3 Composition API进阶指南
前端学步
Vue3技术分享专栏 vue.js javascript 前端
在上一篇文章中,我们介绍了Vue3的CompositionAPI基础,包括如何使用setup函数、ref和reactive来创建响应式数据,以及使用watchEffect来监控数据变化。本文将继续深入探讨CompositionAPI的高级用法,帮助你更好地理解和利用Vue3的新特性。组合多个Hooks在实际开发中,我们经常需要组合使用多个自定义的Hooks来实现复杂的功能。Vue3的Composi
机器学习基本篇
胖胖的小肥猫
机器学习
1基本概念机器学习,分为回归,分类,聚类,降维有监督学习回归,分类,有特征,有标签,进行训练,然后对新数据进行预测无监督学习聚类,降维。题目越多,训练越好,2基本流程数据预处理——模型训练与评估可以优化为获取数据——数据预处理——EDA分析——特征工程——模型训练——可解释性分析2.0数据获取利用kaggle,天池等平台的开源数据,2.1预处理目的:让数据更符合逻辑让数据更容易计算借助函数实现变换
Rust 与 WebAssembly 结合的优势
exploration-earth
学习
性能卓越:Rust语言以其可预测的性能著称,能够避免垃圾收集(GC)引发的暂停问题,这些问题常被称作停止世界(STW)暂停或即时编译(JIT)性能瓶颈。代码精简:由Rust编译生成的.wasm文件体积小巧,这有助于提升网页的加载速度。这些文件不会包含如垃圾收集器等不必要的额外开销,同时,通过高级优化和摇树技术,可以有效剔除无用代码,进一步精简文件大小。无缝集成与互操作:Rust具备自动生成与Rus
机器学习和线性回归、softmax回归
小名叫咸菜
人工智能 线性回归
监督学习监督学习(supervisedlearning)擅⻓在“给定输⼊特征”的情况下预测标签。每个“特征-标签”对都称为一个样本(example)。我们的目标是生成一个模型,能够将任何输⼊特征映射到标签(即预测)。回归——平方误差损失函数回归(regression)是最简单的监督学习任务之一。分类——交叉熵样本属于“哪一类”的问题称为分类问题回归是训练一个回归函数来输出一个数值;分类是训练一个分
ASP.NET MVC实现layui富文本编辑器应用
福伴
先看看视图层在视图层,使用的是视图助手–HtmlHelper,代替我们网页中传统的表单标签元素,其中的m代表实体模型。通过视图助手,为我们生成id和name属性相同的textarea标签。备注:在ASP.NETMVC中,能提交表单数据的元素(各种类型的input标签,textarea等),其属性name的值于实体模型中的属性名相同时,传递到控制器中的实体模型或参数,会自动进行映射,方便前端到后台的
Python如何播放本地音乐并在web页面播放
玩人工智能的辣条哥
开源项目AI Sphere Butler python 前端 开发语言
环境:Python问题描述:Python如何播放本地音乐并在web页面播放解决方案:要在Python中播放本地音乐并在Web页面中播放,您可以采用两种不同的方法:一种是在服务器端使用Python播放音频文件,另一种是创建一个Web应用程序,在客户端通过HTML5的标签来播放音频文件。下面我将分别介绍这两种方法。方法1:使用Python播放本地音乐如果您只是想在服务器端(例如在开发环境中)播放本地音
Golang学习笔记_31——原型模式
LuckyLay
Golang学习笔记 golang 学习 笔记 原型模式
Golang学习笔记_28——工厂方法模式Golang学习笔记_29——抽象工厂模式Golang学习笔记_30——建造者模式文章目录一、原型模式核心概念1.定义2.解决的问题3.核心角色4.类图二、原型模式的特点三、适用场景1.对象创建成本高2.需要动态配置对象3.避免重复初始化4.需要隔离对象构造细节四、与其他创建型模式的对比五、Go语言代码示例六、原型模式的高级用法1.原型注册表2.动态配置对
【Unity粒子特效分享-卡通特效2】
井队Tell
# 粒子特效篇 unity 游戏引擎
卡通特效2前言回顾效果图前言回顾可以点击传送门预览。传送门:【Unity粒子特效分享-宇宙星系】.传送门:【Unity粒子特效分享-魔法粒子特效超炫大招】.传送门:【Unity粒子特效分享-刀光特效】.传送门:【Unity粒子特效分享-技能特效】.传送门:【Unity粒子特效分享-科幻魔法光圈脉冲特效】.传送门:【Unity粒子特效分享-血迹飞溅特效】.传送门:【Unity粒子特效分享-高级炫丽粒
video 标签实现进度条不可拖动,并监听观看状态、超时触发挂机验证
牡丹城沉静的萝卜
html5 前端 javascript
需求:用户观看视频时,实时监听观看状态,超过一定时长后,触发挂机验证,并禁止拖动滚动条快进查看。技术:主要是用html5的vidoe标签做的,用到了自带的暂停(pause)、播放(play)、监听(timeupdate)等事件html:javascript:data(){return{videoUrl:'',video:{currTime:'',maxTime:'',tipsTime:0,//出现
【工具】飞书个人知识库搭建(附详细步骤)
L-ololois
飞书
文章目录一、前言二、准备工作1.注册飞书账号2.熟悉飞书界面三、搭建步骤1.创建知识库根目录2.分类规划3.文档创建与整理4.标签与搜索功能利用四、知识库维护1.定期更新2.内容优化五、安全与备份1.权限管理2.备份策略六、具体步骤一、前言飞书提供了一个便捷的平台来搭建个人知识库,有丰富强大的功能,比如在线文档、表格、问卷及在线画图、画思维导图,还可以存放文件。方便我们整理思绪、存储资料并提高工作
python异常处理链与自定义异常体系设计
懒大王爱吃狼
python python 开发语言 linux 数据库 python学习 Python基础
在Python中,异常处理链和自定义异常体系是两个重要的概念,它们有助于更好地管理程序中的错误和异常情况。异常处理链异常处理链指的是在捕获一个异常后,能够将其信息保留并传递给另一个异常或日志系统。这在多层调用或复杂系统中尤其有用,因为它允许你追踪异常最初发生的位置,同时也可以在每一层添加额外的上下文信息。Python本身并不直接支持异常链的某些高级特性(如Java中的initCause方法),但你
qt实现文字跑马灯效果
凌武贰玖
# QPainter Qt qt 开发语言
实现跑马灯的方式多种多少样,可以通过定时器,或者animation等来实现。本文通过定时器,将第一个文字,移动到最后一个这种方式来实现,还有其他方式哈。直接上源码h文件#ifndefTEXTTICKER_H#defineTEXTTICKER_H#include#include/*跑马灯标签文字*/classTextTicker:publicQLabel{Q_OBJECTpublic:TextTic
鸿蒙应用开发系列 EX篇:HarmonyOS应用开发者基础认证
李小白杂货铺
斜杠人生 harmonyos 华为 鸿蒙系统应用开发者基础认证 鸿蒙应用开发 鸿蒙系统应用开发
文章目录系列文章背景认证考试题库参考注意:题库会不定时的进行具备调整甚至整体轮换,此为2024.5月版本注意:题库中题目的选项每次都会随机顺序,请参考内容判断题单选题多选题系列文章鸿蒙应用开发系列篇一:鸿蒙系统概述鸿蒙应用开发系列篇二:鸿蒙系统开发工具与环境鸿蒙应用开发系列篇三:ArkTS语言鸿蒙应用开发系列篇四:鸿蒙系统应用开发基础鸿蒙应用开发系列篇五:鸿蒙系统高级开发技术鸿蒙应用开发系列篇六:
Java 集成MySQL+MyBatis实战(含代码)
C_V_Better
java mysql 架构设计 java mysql mybatis 后端 数据库
在Java开发中,MyBatis是一个功能强大的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs映射成数据库中的记录。本文将通过实战案例,详细展示如何使用MyBatis集成MySQL,实现对数据库的增删改查操作。一、环境准备在开始编写代码
Python:基于Scapy的深度包分析与网络攻击防御方案
Lethehong
Python在手 bug溜走!码农的快乐 你不懂~ python scapy syn dns
嗨,我是Lethehong!立志在坚不欲说,成功在久不在速欢迎关注:点赞⬆️留言收藏欢迎使用:小智初学计算机网页AI感谢这位博主提出的问题,如果在以后的文章中,大家有其他相关的问题,也可以积极的在评论区评论出来,博主我会的,我会积极的收纳问题,并及时的做出回应!目录1.环境准备2.基础流量捕获3.深度协议解析4.异常流量检测逻辑4.1SYNFlood检测4.2DNS放大攻击检测5.高级分析技术5.
C++/Qt 信号槽机制详解
_S_Q
Qt Qt开发 c++ qt
文章目录C++/Qt信号槽机制详解一、信号和槽的基本概念1.信号2.槽3.连接二、信号和槽的基本使用1.信号和槽的声明和定义2.连接信号和槽三、信号和槽的工作原理1.MOC(Meta-ObjectCompiler)2.事件循环3.连接类型四、信号和槽的高级应用1.自定义信号和槽2.Lambda表达式和函数对象3.信号和槽的断开连接五、总结C++/Qt信号槽机制详解信号和槽是Qt框架中用于对象间通信
使用 Docker 部署 RabbitMQ 的详细指南
m0_74824552
面试 学习路线 阿里巴巴 docker rabbitmq 容器
使用Docker部署RabbitMQ的详细指南在现代应用程序开发中,消息队列系统是不可或缺的一部分。RabbitMQ是一个流行的开源消息代理软件,它实现了高级消息队列协议(AMQP)。本文将详细介绍如何使用Docker部署RabbitMQ,并提供一些配置和管理的技巧。1.前期准备在开始之前,请确保您的系统上已经安装了Docker。如果尚未安装,可以参考Docker官方文档或我写的前面一篇文章Cen
书籍-《概率论I:随机变量与分布》
概率人工智能
书籍:ProbabilityTheoryI:RandomVariablesandDistributions作者:AndreaPascucci出版:Springer编辑:陈萍萍的公主@一点人工一点智能书籍下载-《概率论I:随机变量与分布》01书籍介绍本书提供了概率论简洁而严谨的介绍。在处理这一主题的各种方法中,选择了基于测度理论的最现代方法:尽管这种方法需要更高的数学抽象和精密度,但对于更高级话题如
SQLite Select 语句详解
wjs2024
开发语言
SQLiteSelect语句详解SQLite是一个轻量级的数据库管理系统,以其简洁的设计和高效的性能被广泛应用于各种场景。在SQLite中,SELECT语句是用于查询数据库中的数据的命令。本文将详细介绍SQLite的SELECT语句,包括其基本语法、常用功能以及高级技巧。基本语法SQLite的SELECT语句的基本语法如下:SELECTcolumn1,column2,...FROMtable_na
html 输入框标签讲解,input标签详解
金鉴LED实验室
html 输入框标签讲解
一,标签定义及使用说明1.标签规定了用户可以在其中输入数据的输入字段。2.元素在元素中使用,用来声明允许用户输入数据的input控件。输入字段可通过多种方式改变,取决于type属性。二,HTML与XHTML的区别1.在HTML中,标签没有结束标签。2.在XHTML中,标签必须被正确地关闭。三,注示1.注意:元素是空的,它只包含标签属性。2.提示:你可以使用元素来定义元素的标注。四,属性1.type
分享100个最新免费的高匿HTTP代理IP
mcj8089
代理IP 代理服务器 匿名代理 免费代理IP 最新代理IP
推荐两个代理IP网站:
1. 全网代理IP:http://proxy.goubanjia.com/
2. 敲代码免费IP:http://ip.qiaodm.com/
120.198.243.130:80,中国/广东省
58.251.78.71:8088,中国/广东省
183.207.228.22:83,中国/
mysql高级特性之数据分区
annan211
java 数据结构 mongodb 分区 mysql
mysql高级特性
1 以存储引擎的角度分析,分区表和物理表没有区别。是按照一定的规则将数据分别存储的逻辑设计。器底层是由多个物理字表组成。
2 分区的原理
分区表由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们可以直接访问各个分区。存储引擎管理分区的各个底层
表和管理普通表一样(所有底层表都必须使用相同的存储引擎),分区表的索引只是
JS采用正则表达式简单获取URL地址栏参数
chiangfai
js 地址栏参数获取
GetUrlParam:function GetUrlParam(param){
var reg = new RegExp("(^|&)"+ param +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null
怎样将数据表拷贝到powerdesigner (本地数据库表)
Array_06
powerDesigner
==================================================
1、打开PowerDesigner12,在菜单中按照如下方式进行操作
file->Reverse Engineer->DataBase
点击后,弹出 New Physical Data Model 的对话框
2、在General选项卡中
Model name:模板名字,自
logbackのhelloworld
飞翔的马甲
日志 logback
一、概述
1.日志是啥?
当我是个逗比的时候我是这么理解的:log.debug()代替了system.out.print();
当我项目工作时,以为是一堆得.log文件。
这两天项目发布新版本,比较轻松,决定好好地研究下日志以及logback。
传送门1:日志的作用与方法:
http://www.infoq.com/cn/articles/why-and-how-log
上面的作
新浪微博爬虫模拟登陆
随意而生
新浪微博
转载自:http://hi.baidu.com/erliang20088/item/251db4b040b8ce58ba0e1235
近来由于毕设需要,重新修改了新浪微博爬虫废了不少劲,希望下边的总结能够帮助后来的同学们。
现行版的模拟登陆与以前相比,最大的改动在于cookie获取时候的模拟url的请求
synchronized
香水浓
java thread
Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然
maven 简单实用教程
AdyZhang
maven
1. Maven介绍 1.1. 简介 java编写的用于构建系统的自动化工具。目前版本是2.0.9,注意maven2和maven1有很大区别,阅读第三方文档时需要区分版本。 1.2. Maven资源 见官方网站;The 5 minute test,官方简易入门文档;Getting Started Tutorial,官方入门文档;Build Coo
Android 通过 intent传值获得null
aijuans
android
我在通过intent 获得传递兑现过的时候报错,空指针,我是getMap方法进行传值,代码如下 1 2 3 4 5 6 7 8 9
public
void
getMap(View view){
Intent i =
apache 做代理 报如下错误:The proxy server received an invalid response from an upstream
baalwolf
response
网站配置是apache+tomcat,tomcat没有报错,apache报错是:
The proxy server received an invalid response from an upstream server. The proxy server could not handle the request GET /. Reason: Error reading fr
Tomcat6 内存和线程配置
BigBird2012
tomcat6
1、修改启动时内存参数、并指定JVM时区 (在windows server 2008 下时间少了8个小时)
在Tomcat上运行j2ee项目代码时,经常会出现内存溢出的情况,解决办法是在系统参数中增加系统参数:
window下, 在catalina.bat最前面
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms5
Karam与TDD
bijian1013
Karam TDD
一.TDD
测试驱动开发(Test-Driven Development,TDD)是一种敏捷(AGILE)开发方法论,它把开发流程倒转了过来,在进行代码实现之前,首先保证编写测试用例,从而用测试来驱动开发(而不是把测试作为一项验证工具来使用)。
TDD的原则很简单:
a.只有当某个
[Zookeeper学习笔记之七]Zookeeper源代码分析之Zookeeper.States
bit1129
zookeeper
public enum States {
CONNECTING, //Zookeeper服务器不可用,客户端处于尝试链接状态
ASSOCIATING, //???
CONNECTED, //链接建立,可以与Zookeeper服务器正常通信
CONNECTEDREADONLY, //处于只读状态的链接状态,只读模式可以在
【Scala十四】Scala核心八:闭包
bit1129
scala
Free variable A free variable of an expression is a variable that’s used inside the expression but not defined inside the expression. For instance, in the function literal expression (x: Int) => (x
android发送json并解析返回json
ronin47
android
package com.http.test;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import
一份IT实习生的总结
brotherlamp
PHP php资料 php教程 php培训 php视频
今天突然发现在不知不觉中自己已经实习了 3 个月了,现在可能不算是真正意义上的实习吧,因为现在自己才大三,在这边撸代码的同时还要考虑到学校的功课跟期末考试。让我震惊的是,我完全想不到在这 3 个月里我到底学到了什么,这是一件多么悲催的事情啊。同时我对我应该 get 到什么新技能也很迷茫。所以今晚还是总结下把,让自己在接下来的实习生活有更加明确的方向。最后感谢工作室给我们几个人这个机会让我们提前出来
据说是2012年10月人人网校招的一道笔试题-给出一个重物重量为X,另外提供的小砝码重量分别为1,3,9。。。3^N。 将重物放到天平左侧,问在两边如何添加砝码
bylijinnan
java
public class ScalesBalance {
/**
* 题目:
* 给出一个重物重量为X,另外提供的小砝码重量分别为1,3,9。。。3^N。 (假设N无限大,但一种重量的砝码只有一个)
* 将重物放到天平左侧,问在两边如何添加砝码使两边平衡
*
* 分析:
* 三进制
* 我们约定括号表示里面的数是三进制,例如 47=(1202
dom4j最常用最简单的方法
chiangfai
dom4j
要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.zip
解开后有两个包,仅操作XML文档的话把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的话还需要
简单HBase笔记
chenchao051
hbase
一、Client-side write buffer 客户端缓存请求 描述:可以缓存客户端的请求,以此来减少RPC的次数,但是缓存只是被存在一个ArrayList中,所以多线程访问时不安全的。 可以使用getWriteBuffer()方法来取得客户端缓存中的数据。 默认关闭。 二、Scan的Caching 描述: next( )方法请求一行就要使用一次RPC,即使
mysqldump导出时出现when doing LOCK TABLES
daizj
mysql mysqdump 导数据
执行 mysqldump -uxxx -pxxx -hxxx -Pxxxx database tablename > tablename.sql
导出表时,会报
mysqldump: Got error: 1044: Access denied for user 'xxx'@'xxx' to database 'xxx' when doing LOCK TABLES
解决
CSS渲染原理
dcj3sjt126com
Web
从事Web前端开发的人都与CSS打交道很多,有的人也许不知道css是怎么去工作的,写出来的css浏览器是怎么样去解析的呢?当这个成为我们提高css水平的一个瓶颈时,是否应该多了解一下呢?
一、浏览器的发展与CSS
《阿甘正传》台词
dcj3sjt126com
Part Ⅰ:
《阿甘正传》Forrest Gump经典中英文对白
Forrest: Hello! My names Forrest. Forrest Gump. You wanna Chocolate? I could eat about a million and a half othese. My momma always said life was like a box ochocol
Java处理JSON
dyy_gusi
json
Json在数据传输中很好用,原因是JSON 比 XML 更小、更快,更易解析。
在Java程序中,如何使用处理JSON,现在有很多工具可以处理,比较流行常用的是google的gson和alibaba的fastjson,具体使用如下:
1、读取json然后处理
class ReadJSON
{
public static void main(String[] args)
win7下nginx和php的配置
geeksun
nginx
1. 安装包准备
nginx : 从nginx.org下载nginx-1.8.0.zip
php: 从php.net下载php-5.6.10-Win32-VC11-x64.zip, php是免安装文件。
RunHiddenConsole: 用于隐藏命令行窗口
2. 配置
# java用8080端口做应用服务器,nginx反向代理到这个端口即可
p
基于2.8版本redis配置文件中文解释
hongtoushizi
redis
转载自: http://wangwei007.blog.51cto.com/68019/1548167
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件。采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务。下面是Redis2.8.9的配置文
第五章 常用Lua开发库3-模板渲染
jinnianshilongnian
nginx lua
动态web网页开发是Web开发中一个常见的场景,比如像京东商品详情页,其页面逻辑是非常复杂的,需要使用模板技术来实现。而Lua中也有许多模板引擎,如目前我在使用的lua-resty-template,可以渲染很复杂的页面,借助LuaJIT其性能也是可以接受的。
如果学习过JavaEE中的servlet和JSP的话,应该知道JSP模板最终会被翻译成Servlet来执行;而lua-r
JZSearch大数据搜索引擎
颠覆者
JavaScript
系统简介:
大数据的特点有四个层面:第一,数据体量巨大。从TB级别,跃升到PB级别;第二,数据类型繁多。网络日志、视频、图片、地理位置信息等等。第三,价值密度低。以视频为例,连续不间断监控过程中,可能有用的数据仅仅有一两秒。第四,处理速度快。最后这一点也是和传统的数据挖掘技术有着本质的不同。业界将其归纳为4个“V”——Volume,Variety,Value,Velocity。大数据搜索引
10招让你成为杰出的Java程序员
pda158
java 编程 框架
如果你是一个热衷于技术的
Java 程序员, 那么下面的 10 个要点可以让你在众多 Java 开发人员中脱颖而出。
1. 拥有扎实的基础和深刻理解 OO 原则 对于 Java 程序员,深刻理解 Object Oriented Programming(面向对象编程)这一概念是必须的。没有 OOPS 的坚实基础,就领会不了像 Java 这些面向对象编程语言
tomcat之oracle连接池配置
小网客
oracle
tomcat版本7.0
配置oracle连接池方式:
修改tomcat的server.xml配置文件:
<GlobalNamingResources>
<Resource name="utermdatasource" auth="Container"
type="javax.sql.DataSou
Oracle 分页算法汇总
vipbooks
oracle sql 算法 .net
这是我找到的一些关于Oracle分页的算法,大家那里还有没有其他好的算法没?我们大家一起分享一下!
-- Oracle 分页算法一
select * from (
select page.*,rownum rn from (select * from help) page
-- 20 = (currentPag