一个Django应用,可以分析并报告您向其注册的任何模型中的链接。
项目描述
一个相当灵活的应用程序,可以分析并报告您向其注册的任何模型中的链接。
链接可以是裸露的(url或图像和文件字段)或嵌入在HTML中(linkcheck处理解析)。如果您需要做更复杂的事情(如从slug字段生成URL等),可以轻松覆盖Linkcheck对象的函数。
您应该通过cron或类似工具运行其管理命令,定期检查外部链接的状态是否发生变化。当对象保存时,所有链接都会自动进行检查。这是通过信号处理的。
最低要求
django-linkcheck 需要 Python 3.8 和 Django 3.2。
基本用法
将应用安装到您的 Python 路径上的某个位置(例如,使用 pip install django-linkcheck)。
将 'linkcheck' 添加到您的 settings.INSTALLED_APPS 中。
为每个应用添加一个名为 linklists.py 的文件(请参考 examples/linklists.py 中的示例),该文件满足以下条件:
包含内容的模型(例如,url/image 字段、标记片段或任何在显示时转换为 IMG 或 HREF 的内容)
可以作为链接的目标 - 也就是说,由 URL 指向 - 在这种情况下,请确保它有一个名为 ‘get_absolute_url’ 的实例方法
提示:您可以使用以下命令为您的模型创建一个示例配置
manage.py linkcheck_suggest_config --model sampleapp.SampleModel > sampleapp/linklists.py
运行 ./manage.py migrate。
将以下内容添加到您的根 URL 配置中
path('admin/linkcheck/', include('linkcheck.urls'))
使用浏览器查看 /admin/linkcheck/。
我们意识到这份文档内容相对简略,因此欢迎任何关于完善或澄清的建议。
链接列表类
以下类属性可以添加到您的 Linklist 子类中以自定义提取的链接
object_filter:一个字典,将被用作应用于目标类默认查询集的 filter 参数的过滤参数。这允许您过滤要从中提取链接的对象。 (示例:{'active': True})
object_exclude:一个字典,将被用作应用于目标类默认查询集的 exclude 参数的过滤参数。与 object_filter 类似,这允许您排除要从中提取链接的对象。
html_fields:一个字段名称列表,将用于搜索链接。
url_fields:一个 URLField 字段名称列表,其内容将被视为链接。如果字段内容为空且字段名称在 ignore_empty 中,则内容将被忽略。
ignore_empty:一个来自 url_fields 的字段列表。请参阅上面的说明。(自 django-linkcheck 1.1 以来新增)
image_fields:一个 ImageField 字段名称列表,其内容将被视为链接。空的 ImageField 内容总是被忽略。
filter_callable:一个可调用对象,允许将函数作为过滤参数传递给您的链接列表类。这允许您应用更高级的过滤操作。此函数必须是一个类方法,并且它应该接收对象查询集并返回过滤后的对象。在您的 linklists.py 中的示例用法 - 仅检查最新版本
@classmethod def filter_callable(cls, objects): latest = Model.objects.filter(id=OuterRef('id')).order_by('-version') return objects.filter(version=Subquery(latest.values('version')[:1]))
管理命令
findlinks
此命令遍历所有注册的字段并记录它找到的 URL。此命令不进行任何验证。通常在安装和配置 django-linkcheck 后立即运行。
checklinks
对于每个记录的 URL,检查并报告 URL 的有效性。所有内部链接都会进行检查,但只有在过去 LINKCHECK_EXTERNAL_RECHECK_INTERVAL 分钟内未检查的外部链接才会进行检查。此间隔可以通过使用 --externalinterval (-e)命令选项(以分钟为单位)来按调用调整。
您还可以通过传递一个数字给--limit(--l)命令选项来限制要检查的最大链接数。
linkcheck_suggest_config
此命令遍历所有模型,并检查它们是否包含由linkcheck可检查的字段。如果尚未注册,则会建议一个示例配置。
您还可以传递--model选项为指定的模型生成一个示例配置。
设置
LINKCHECK_DISABLE_LISTENERS
这是一个完全禁用linkcheck的设置,通常在运行测试时使用。也请参阅下面的上下文管理器。
LINKCHECK_EXTERNAL_RECHECK_INTERVAL
默认值:10080(1周,以分钟为单位)
不会重新检查最近检查过的任何外部链接。
LINKCHECK_EXTERNAL_REGEX_STRING
默认值:r’^https?://’
一个字符串,作为正则表达式应用于URL,以确定它是内部还是外部。
LINKCHECK_MEDIA_PREFIX
默认值:‘/media/’
当前linkcheck通过将URL转换为本地文件系统路径来检查指向内部静态媒体的链接是否正确。
它从内部链接中移除MEDIA_PREFIX,并将结果连接到settings.MEDIA_ROOT,然后使用os.path.exists进行测试。
这“对我有效”,但可能会破坏其他人的设置。欢迎提交补丁。
LINKCHECK_RESULTS_PER_PAGE
控制分页。
由于链接是按对象分组的,所以目前分页有些奇怪。
LINKCHECK_MAX_URL_LENGTH
默认值:255
URL字段的长度。默认为255,以兼容MySQL(见https://docs.django.ac.cn/en/dev/ref/databases/#notes-on-specific-fields)
LINKCHECK_CONNECTION_ATTEMPT_TIMEOUT
默认值:10
每个连接尝试的超时时间(秒)。有时限制每个连接的检查时间可以减少总检查时间。
SITE_DOMAIN和LINKCHECK_SITE_DOMAINS
Linkcheck使用不同的方式测试外部和内部链接。内部链接使用Django测试客户端,而外部链接则使用urllib2进行测试。
将内部链接测试为外部链接可能导致某些情况下出现错误,因此Linkcheck需要知道哪些外部URL应被视为内部。
Linkcheck寻找上述任何一个设置。如果不存在LINKCHECK_SITE_DOMAINS,则仅使用SITE_DOMAIN。
SITE_DOMAIN = “mysite.com”
将指示linkchecker将以下链接视为内部链接:
mysite.com www.mysite.com test.mysite.com
如果您将LINKCHECK_SITE_DOMAINS设置为一个列表或元组,则可以显式列出应被视为内部的域名。
LINKCHECK_TOLERATE_BROKEN_ANCHOR
默认值:True
是否将带有损坏的hash锚点的链接标记为有效。如果您想要将锚点不包含在链接目标的HTML源中的链接标记为无效,则禁用此选项。
django-filebrowser集成
如果您的路径上存在django-filebrowser,则linkcheck将监听post-upload、delete和rename信号,并根据需要进行更新。
贡献
您可以使用额外的dev安装所有开发设置的要求。
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install -e .[dev]
$ django-admin compilemessages --ignore=.venv # Optionally compile translation file
如果您想使用flake8和isort的pre-commit钩子,请使用以下命令启用它们:
$ pre-commit install
运行测试
可以使用linkcheck根目录中的runtests.py脚本来独立运行测试。
$ python runtests.py
如果您想在项目上下文中运行linkcheck测试,应在您的INSTALLED_APPS设置中包含'linkcheck.tests.sampleapp'。
Linkcheck为您提供了两个上下文管理器来启用或禁用您自己的测试中的监听器。例如
def test_something_without_listeners(self):
with listeners.disable_listeners():
# Create/update here without linkcheck intervening.
如果您定义了LINKCHECK_DISABLE_LISTENERS设置,则可以通过以下方式临时启用它:
def test_something_with_listeners(self):
with listeners.enable_listeners():
# Create/update here and see linkcheck activated.
翻译
目前此应用支持英语、德语和法语。如果您想为LOCALE贡献翻译,请运行
django-admin makemessages --locale LOCALE
并编辑linkcheck/locale/LOCALE/LC_MESSAGES/django.po中的相应文件。
创建新版本
在pyproject.toml中增加版本号
创建发布提交:git commit --message "发布 vX.Y.Z"
创建git标签:git tag -a "X.Y.Z" -m "发布 vX.Y.Z"
将提交和标签推送到仓库:git push && git push --tags
构建源代码发行版:python -m build
将软件包发布到PyPI:twine upload dist/django-linkcheck-X.Y.Z*
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码发行版
构建发行版
django-linkcheck-2.3.0.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b9e5e626e7eb6f9103b85827135767416968c01359f18289b2f41ed34ab03066 |
|
MD5 | 9b5e9d941234b87cc27a10b899e5dd72 |
|
BLAKE2b-256 | f9c65069cceb28f9be0d7af949e2b61ebe50c0f0517383a5526ade6f630b2114 |
django_linkcheck-2.3.0-py3-none-any.whl的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3b0d3f319ae5d1bef37967f9b760180f0220d4bb6b6bcb5c0d55d4d897148b42 |
|
MD5 | 1e25da86c58acf8f3b5bd6492840d8ae |
|
BLAKE2b-256 | a4a7f7bc17f6a4d67a75418621f2feb98ffd217c93b93dc9ced20686d378cf1f |