用户使用Django-Userskins自定义网站样式
Django(72)对于Django项目,我正在研究我想让用户从少数皮肤中选择来个性化网站的外观(类似于Twitter的新款剥皮功能),并决定尝试将一个可插拔的应用程序放在一起以实现这一目标。
自述文件在讨论实施细节方面是相当彻底的,但我仍然会在这里发言。
最低可能的数据库命中。
我认为,尽可能避免数据库点击是很重要的,因为如果您的网站因其开始慢慢加载,允许用户选择皮肤并不大大改进。我的方法是使用cookie持久性,如果经过身份验证的用户没有cookie,那么它通过检查数据库中的皮肤首选项来为它们重新创建一个cookie。因此,每个用户只能每次清除浏览器的cookie时达到一次数据库一次。
此外,Django-Userskins有一个选项永远不会击中数据库,并且在这种情况下它只使用cookie来存储用户的首选皮肤。
节点带宽。
我觉得我感到很重要的另一个问题是尽可能地节省带宽。在这方面,我不喜欢任何涉及将定制样式表注入应用模板的方法,因为它不允许缓存/缩小/远期到期,并与每个单个呈现的模板重新发送。
相反,Django-Userskins允许您指定CSS文件以加载每个皮肤。一个简单的案例如下所示:
USERSKINS_DEFAULT=“光”Userskins_details.={'光':'light.css'那'黑暗的':'黑暗.css'那}
这将被使用用户金
模板标签......
{%加载用户金s%} 亚达耶达 title>{%用户金%} head>
to render something like this:
亚达耶达 title><链接rel=“样式表”href =“http://127.0.0.1:8000/MEDIA/light.css”> head>
更令人兴奋的(对我来说),Django-Userskins可以与之整合django-compress。您的设置文件将看起来像这样:
压缩=真的compress_version.=真的compress_css.={'光':{'source_filenames':('CSS / BASE.CSS'那'CSS / Skins / Light.css'),'output_filename':'css / light_skin.r?.css'那},'黑暗的':{'source_filenames':('CSS / BASE.CSS'那'CSS / Skins / Dark.css'),'output_filename':'css/dark_skin.r?.css'那},}USERSKINS_DEFAULT=“光”与Django-Compress集成时,不使用userskins_detailsuserskins_use_compress_groups.=真的
模板标记的使用完全相同,但将输出所选皮肤的压缩,合并和版本化文件。
{%加载用户金s%} 亚达耶达 title>{%用户金%} head>
使用Django-Compress和Django-Userskins的这种组合,您可以支持用户天选项,而无需使用每个页面发送其他数据,并且(具有远未来到期)而不添加额外的HTTP请求以检索Skin的CSS文件。结合数据库访问的最小方法,应该可以使用Django-Userskins对您网站的性能和带宽使用率的影响最小。
用于经过身份验证和匿名用户的皮肤。
关于Django-Userskins的一个很好的事情是那些未登录的用户也可以指定皮肤(持久通过cookie)。设置个人cookie的代码可以像这样简单(例如,如果您只有侧边栏中的可用皮革列表,并且用户只需单击链接以更改所选的皮肤):
从django.conf.urls.defaults.进口*从django.http.进口httpresponseredirect.从Userskins.models.进口SkinPreference.def暗黑皮肤(要求):HRR.=httpresponseredirect.(“/”)HRR.。set_cookie.(“userskins”那“黑暗的”)如果要求。user。is_authenticated():尝试:SP.=SkinPreference.。对象。得到(user=要求。user)SP.。皮肤=“黑暗的”SP.。保存()除了SkinPreference.。ObjectDoesNotexist.:SP.=SkinPreference.。对象。创造(user=要求。user那皮肤=“黑暗的”)返回HRR.
defLight_skin.(要求):HRR.=httpresponseredirect.(“/”)HRR.。set_cookie.(“userskins”那“光”)如果要求。user。is_authenticated():尝试:SP.=SkinPreference.。对象。得到(user=要求。user)SP.。皮肤=“黑暗的”SP.。保存()除了SkinPreference.。ObjectDoesNotexist.:SP.=SkinPreference.。对象。创造(user=要求。user那皮肤=“光”)返回HRR.
URLPatterns.=图案(''那(r'^皮肤/暗/ $'那暗黑皮肤),(r'^skin/light/$'那Light_skin.),)
如果您没有经过身份验证的用户,则选择视图会更短:
defLight_skin.(要求):HRR.=httpresponseredirect.(“/”)HRR.。set_cookie.(“userskins”那“光”)返回HRR.
错过任何东西?
你能想到其他用例吗covered by the existing design? Let me know and I'll incorporate them as best I can.
我会很快将Django-Userskins集成到我的真实应用程序中,并将尽一点突然改善它,但除非发现了新的useecases,否则我并不想象许多剧烈的变化。
git存储库在github上,而且可以在那里找到README文件。