用git的一开开源项目搭建一个网站,想把url样式修改成下边这样的,
domian/t/zhe-shi-pin-yin/436 --> domian/t/436 or domian/t/thread/436
搜索了一下没有找到相关内容,请问应该怎样去掉呢? 说明文档:
MISAGO_SLUGIFY
Path to function or callable used by Misago to generate slugs. Defaults to misago.core.slugify.default. Use this function if you want to customize slugs generation on your community.
utils.py
from datetime import datetime, timedelta
from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.http import Http404
from django.urls import resolve, reverse
from django.utils import html, timezone
from django.utils.encoding import force_text
from django.utils.module_loading import import_string
MISAGO_SLUGIFY = getattr(settings, 'MISAGO_SLUGIFY', 'misago.core.slugify.default')
slugify = import_string(MISAGO_SLUGIFY)
def format_plaintext_for_html(string):
return html.linebreaks(html.urlize(html.escape(string)))
def encode_json_html(string):
return string.replace('<', r'\u003C')
ISO8601_FORMATS = ("%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%S.%f", )
def parse_iso8601_string(value):
"""turns ISO 8601 string into datetime object"""
value = force_text(value, strings_only=True).rstrip('Z')
for format in ISO8601_FORMATS:
try:
parsed_value = datetime.strptime(value, format)
break
except ValueError:
try:
parsed_value = datetime.strptime(value[:-6], format)
break
except ValueError:
pass
else:
raise ValueError('failed to hydrate the %s timestamp' % value)
offset_str = value[-6:]
if offset_str and offset_str[0] in ('-', '+'):
tz_offset = timedelta(hours=int(offset_str[1:3]), minutes=int(offset_str[4:6]))
tz_offset = tz_offset.seconds // 60
if offset_str[0] == '-':
tz_offset *= -1
else:
tz_offset = 0
tz_correction = timezone.get_fixed_timezone(tz_offset)
return timezone.make_aware(parsed_value, tz_correction)
def hide_post_parameters(request):
"""
Mark request as having sensitive parameters
We can't use decorator because of DRF uses custom HttpRequest
that is incompatibile with Django's decorator
"""
request.sensitive_post_parameters = '__ALL__'
def clean_return_path(request):
"""return path utility that returns return path from referer or POST"""
if request.method == 'POST' and 'return_path' in request.POST:
return _get_return_path_from_post(request)
else:
return _get_return_path_from_referer(request)
def _get_return_path_from_post(request):
return_path = request.POST.get('return_path')
try:
if not return_path:
raise ValueError()
if not return_path.startswith('/'):
raise ValueError()
resolve(return_path)
return return_path
except (Http404, ValueError):
return None
def _get_return_path_from_referer(request):
referer = request.META.get('HTTP_REFERER')
try:
if not referer:
raise ValueError()
if not referer.startswith(request.scheme):
raise ValueError()
referer = referer[len(request.scheme) + 3:]
if not referer.startswith(request.META['HTTP_HOST']):
raise ValueError()
referer = referer[len(request.META['HTTP_HOST'].rstrip('/')):]
if not referer.startswith('/'):
raise ValueError()
resolve(referer)
return referer
except (Http404, KeyError, ValueError):
return None
def is_request_to_misago(request):
try:
return request._request_to_misago
except AttributeError:
request._request_to_misago = _is_request_path_under_misago(request)
return request._request_to_misago
def _is_request_path_under_misago(request):
# We are assuming that forum_index link is root of all Misago links
forum_index = reverse('misago:index')
path_info = request.path_info
if len(forum_index) > len(path_info):
return False
return path_info[:len(forum_index)] == forum_index
def is_referer_local(request):
referer = request.META.get('HTTP_REFERER')
if not referer:
return False
if not referer.startswith(request.scheme):
return False
referer = referer[len(request.scheme) + 3:]
if not referer.startswith(request.META['HTTP_HOST']):
return False
referer = referer[len(request.META['HTTP_HOST'].rstrip('/')):]
if not referer.startswith('/'):
return False
return True
def get_exception_message(exception=None, default_message=None):
if not exception:
return default_message
try:
return exception.args[0]
except IndexError:
return default_message
def clean_ids_list(ids_list, error_message):
try:
return list(map(int, ids_list))
except (ValueError, TypeError):
raise PermissionDenied(error_message)
slugify.py:
from unidecode import unidecode
from django.template.defaultfilters import slugify as django_slugify
from django.utils import six
def default(string):
string = six.text_type(string)
string = unidecode(string)
return django_slugify(string.replace('_', ' ').strip())
config.py
from django.utils.six.moves import configparser
yapf = configparser.ConfigParser()
yapf.read('.style.yapf')
urls.py
from django.conf.urls import include, url
from django.views.generic import TemplateView
from misago.conf import settings
from misago.core.views import forum_index
app_name = 'misago'
# Register Misago Apps
urlpatterns = [
url(r'^', include('misago.legal.urls')),
url(r'^', include('misago.users.urls')),
url(r'^', include('misago.categories.urls')),
url(r'^', include('misago.threads.urls')),
url(r'^', include('misago.search.urls')),
# default robots.txt
url(
r'^robots.txt$',
TemplateView.as_view(content_type='text/plain', template_name='misago/robots.txt')
),
# "misago:index" link symbolises "root" of Misago links space
# any request with path that falls below this one is assumed to be directed
# at Misago and will be handled by misago.views.exceptionhandler if it
# results in Http404 or PermissionDenied exception
url(r'^$', forum_index, name='index'),
]
# Register API
apipatterns = [
url(r'^', include('misago.categories.urls.api')),
url(r'^', include('misago.markup.urls')),
url(r'^', include('misago.threads.urls.api')),
url(r'^', include('misago.users.urls.api')),
url(r'^', include('misago.search.urls.api')),
]
urlpatterns += [
url(r'^api/', include((apipatterns, 'api'), namespace='api')),
]
# Register Misago ACP
if settings.MISAGO_ADMIN_PATH:
# Admin patterns recognised by Misago
adminpatterns = [
url(r'^', include('misago.admin.urls')),
]
admin_prefix = r'^%s/' % settings.MISAGO_ADMIN_PATH
urlpatterns += [
url(admin_prefix, include((adminpatterns, 'admin'), namespace='admin')),
]
__init__.py
from django.conf.urls import url
from misago.conf import settings
from misago.threads.views.attachment import attachment_server
from misago.threads.views.goto import (
ThreadGotoPostView, ThreadGotoLastView, ThreadGotoNewView, ThreadGotoUnapprovedView,
PrivateThreadGotoPostView, PrivateThreadGotoLastView, PrivateThreadGotoNewView
)
from misago.threads.views.list import ForumThreadsList, CategoryThreadsList, PrivateThreadsList
from misago.threads.views.thread import ThreadView, PrivateThreadView
LISTS_TYPES = ('all', 'my', 'new', 'unread', 'subscribed', 'unapproved', )
def threads_list_patterns(prefix, view, patterns):
urls = []
for i, pattern in enumerate(patterns):
if i > 0:
url_name = '%s-%s' % (prefix, LISTS_TYPES[i])
else:
url_name = prefix
urls.append(
url(
pattern,
view.as_view(),
name=url_name,
kwargs={'list_type': LISTS_TYPES[i]},
)
)
return urls
if settings.MISAGO_THREADS_ON_INDEX:
urlpatterns = threads_list_patterns(
'threads', ForumThreadsList,
(r'^$', r'^my/$', r'^new/$', r'^unread/$', r'^subscribed/$', r'^unapproved/$', )
)
else:
urlpatterns = threads_list_patterns(
'threads', ForumThreadsList, (
r'^threads/$', r'^threads/my/$', r'^threads/new/$', r'^threads/unread/$',
r'^threads/subscribed/$', r'^threads/unapproved/$',
)
)
urlpatterns += threads_list_patterns(
'category', CategoryThreadsList, (
r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/$',
r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/my/$',
r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/new/$',
r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/unread/$',
r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/subscribed/$',
r'^c/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/unapproved/$',
)
)
urlpatterns += threads_list_patterns(
'private-threads', PrivateThreadsList, (
r'^private-threads/$', r'^private-threads/my/$', r'^private-threads/new/$',
r'^private-threads/unread/$', r'^private-threads/subscribed/$',
)
)
def thread_view_patterns(prefix, view):
urls = [
url(r'^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/$' % prefix[0], view.as_view(), name=prefix),
url(
r'^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/(?P<page>\d+)/$' % prefix[0],
view.as_view(),
name=prefix
),
]
return urls
urlpatterns += thread_view_patterns('thread', ThreadView)
urlpatterns += thread_view_patterns('private-thread', PrivateThreadView)
def goto_patterns(prefix, **views):
urls = []
post_view = views.pop('post', None)
if post_view:
url_pattern = r'^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/post/(?P<post>\d+)/$' % prefix[0]
url_name = '%s-post' % prefix
urls.append(url(url_pattern, post_view.as_view(), name=url_name))
for name, view in views.items():
url_pattern = r'^%s/(?P<slug>[-a-zA-Z0-9]+)/(?P<pk>\d+)/%s/$' % (prefix[0], name)
url_name = '%s-%s' % (prefix, name)
urls.append(url(url_pattern, view.as_view(), name=url_name))
return urls
urlpatterns += goto_patterns(
'thread',
post=ThreadGotoPostView,
last=ThreadGotoLastView,
new=ThreadGotoNewView,
unapproved=ThreadGotoUnapprovedView
)
urlpatterns += goto_patterns(
'private-thread',
post=PrivateThreadGotoPostView,
last=PrivateThreadGotoLastView,
new=PrivateThreadGotoNewView,
)
urlpatterns += [
url(r'^a/(?P<secret>[-a-zA-Z0-9]+)/(?P<pk>\d+)/', attachment_server, name='attachment'),
url(
r'^a/thumb/(?P<secret>[-a-zA-Z0-9]+)/(?P<pk>\d+)/',
attachment_server,
name='attachment-thumbnail',
kwargs={'thumbnail': True}
),
]