无头模式下的摇尾预览。

wagtail-headless-preview的Python项目详细描述


Wagtail Headless PreviewPyPI

概述

wagtail作为后端,前端有一个单独的应用程序(例如一个单页的react应用程序),编辑器不再能够预览他们的更改。这是因为前端不再由Wagtail直接控制。因此,预览数据需要向前端应用程序公开。

此包通过将预览路由到指定的前端url,在无头设置中使用时启用wagtail页面的预览。

设置

使用pip安装:

pip install wagtail-headless-preview

安装模块后,将wagtail_headless_preview添加到设置文件中已安装的应用:

# settings.pyINSTALLED_APPS=[...'wagtail_headless_preview',]

运行迁移:

$ ./manage.py migrate

然后使用HEADLESS_PREVIEW_CLIENT_URLS设置配置预览客户端url。

对于单个站点,配置应该如下所示:

HEADLESS_PREVIEW_CLIENT_URLS={'default':'http://localhost:8020/',}

对于多站点设置,请将每个站点添加为单独的条目:

HEADLESS_PREVIEW_CLIENT_URLS={'default':'http://localhost:8020/','site1.example.com':'http://localhost:8020/','site2.example.com':'http://localhost:8021/',}

也可以使用HEADLESS_PREVIEW_LIVE设置启用实时预览功能:

# settings.pyHEADLESS_PREVIEW_LIVE=True

注意:您的前端应用程序必须设置为实时预览,此功能通常需要Django Channels或其他websocket/async库。

用法

HeadlessPreviewMixin添加到页面类:

fromwagtail_headless_preview.modelsimportHeadlessPreviewMixinclassMyWonderfulPage(HeadlessPreviewMixin,Page):pass

我的前端应用程序将如何显示预览内容?

这取决于你的项目,因为它将取决于你的前端应用程序的要求。

下面的示例使用wagtail api端点访问预览- 您的应用可能会选择使用GraphQL访问页面预览。

示例

此示例设置一个api端点,该端点将返回页面的预览,然后在简化的演示前端应用程序上显示该数据。

  • wagtail.api.v2添加到已安装的应用:
# settings.pyINSTALLED_APPS=[...'wagtail.api.v2',]
  • 在项目目录中创建一个api.py文件:
fromdjango.contrib.contenttypes.modelsimportContentTypefromwagtail.api.v2.endpointsimportPagesAPIEndpointfromwagtail.api.v2.routerimportWagtailAPIRouterfromwagtail_headless_preview.modelsimportPagePreviewfromrest_framework.responseimportResponse# Create the router. "wagtailapi" is the URL namespaceapi_router=WagtailAPIRouter('wagtailapi')classPagePreviewAPIEndpoint(PagesAPIEndpoint):known_query_parameters=PagesAPIEndpoint.known_query_parameters.union(['content_type','token'])deflisting_view(self,request):page=self.get_object()serializer=self.get_serializer(page)returnResponse(serializer.data)defdetail_view(self,request,pk):page=self.get_object()serializer=self.get_serializer(page)returnResponse(serializer.data)defget_object(self):app_label,model=self.request.GET['content_type'].split('.')content_type=ContentType.objects.get(app_label=app_label,model=model)page_preview=PagePreview.objects.get(content_type=content_type,token=self.request.GET['token'])page=page_preview.as_page()ifnotpage.pk:# fake primary key to stop API URL routing from complainingpage.pk=0returnpageapi_router.register_endpoint('page_preview',PagePreviewAPIEndpoint)
  • 注册api url,以便django可以将请求路由到api:
# urls.pyfrom.apiimportapi_routerurlpatterns=[...path('api/v2/',api_router.urls),...# Ensure that the api_router line appears above the default Wagtail page serving routepath('',include(wagtail_urls)),]

有关配置wagtail api的更多信息,请参阅Wagtail API v2 Configuration Guide

  • 接下来,在项目根目录中添加一个client/index.html文件。这将查询api以显示我们的预览:
<!DOCTYPE html><html><head><script>functiongo(){varquerystring=window.location.search.replace(/^\?/,'');varparams={};querystring.replace(/([^=&]+)=([^&]*)/g,function(m,key,value){params[decodeURIComponent(key)]=decodeURIComponent(value);});varapiUrl='http://localhost:8000/api/v2/page_preview/1/?content_type='+encodeURIComponent(params['content_type'])+'&token='+encodeURIComponent(params['token'])+'&format=json';fetch(apiUrl).then(function(response){response.text().then(function(text){document.body.innerText=text;});});}</script></head><bodyonload="go()"></body></html>
  • 安装django cors头文件:pip install django-cors-headers
  • 将cors config添加到您的设置文件中,以允许前端访问api
CORS_ORIGIN_ALLOW_ALL=TrueCORS_URLS_REGEX=r'^/api/v2/'

然后跟着setup instructions for django-cors-headers的其余部分。

  • 正常启动站点:./manage.py runserver 0:8000
  • http://localhost:8020/服务前端client/index.html
    • 这可以通过在客户机目录中运行python3 -m http.server 8020来完成
  • 在wagtail管理界面中,编辑(或创建)并预览使用HeadlessPreviewMixin

预览页面现在应该显示预览的api响应!

这是一个真正的前端将接管和显示预览,因为它将在现场看到。

学分

  • Matthew Westcott(@gasman),概念的初始证明
  • 卡尔·霍布利(@kaedroho),改进

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何向xsi:nil元素添加另一个属性?   Java抽象泛型方法,使用具体类型实现通配符   java使用pcap4j截断pcap文件   当我放置字母a、b和c时,java中的异常预期会下降   java设置活动对话框不可取消   接口类型变量上的Java克隆   使用Java或BouncyCastle对CSR(证书签名请求)进行安全解码/读取   java调用SavingsAccount对象上的函数并打印结果   java如何在Android应用程序上显示地图上的兴趣点(POI)并与之交互?   如果在JavaFX中的ResultSet中未找到任何内容,则显示java警报   java我将springboot和@component与@scheduled一起使用,它每12小时锁定一次   ApachePOI如何使用java删除包含字符串的word表的行   java如果对象(x,y)靠近其他对象(x,y)   从未对JMSException调用java JMS CachingConnectionFactory OneException方法   javascript使用java将HTML页面转换为MS word