Mezzanine の Blog 投稿時に何度か以下のエラーが発生しており、困ります。
対応方法を備忘としてメモします。

Request Method: GET
Request URL:    http://www.monotalk.xyz/blog/dropwizard-jar%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-%E3%81%A8%E3%81%9D%E3%81%AE%E5%8B%95%E4%BD%9C%E5%87%BA%E5%8A%9B%E7%B5%90%E6%9E%9C/
Django Version: 1.6.11
Exception Type: DataError
Exception Value:    
値は型character varying(200)としては長すぎます


前提

関連するミドルウェア、フレームワークの Version を以下に記載します。

  • Django の Version

    1.6.11
    

  • Mezzanine の Version

    3.1.10
    

  • PostgreSQL

    psql (8.4.20)
    


原因

PostgreSQL で データ登録、データ更新時に varchar カラムの文字数を超える文字を設定した場合に発生します。
以下、PostgreSQL 9.6.5 の 文字型についてのドキュメントになります。
8.3. 文字型

ドキュメントに、興味深い記載がありましたので、引用します。
文字列長は定義するものだと思っていたので、定義しなくてよいというのは私の中では新しかったです。

データ型宣言に使われるnに許される最大値はこれより小さいものです。 マルチバイト文字符号化方式においては文字数とバイト数はまったく異なっているため、この値の変更は便利ではありません。 特定の上限を設けずに長い文字列を保存したい場合は、適当な上限を設けるよりも、textもしくは長さの指定がないcharacter varyingを使用してください。


Mezzanine でエラーとなる具体的なオペレーション

基本的に長いブログタイトルをつけがちなのですが、タイトルとして長すぎる日本語を使用した際に、発生していました。
事象が発生するのは Mezzanine 3.1.10 までで、 Mezzanine 4 以降は、マイグレーションファイルが更新されていてこのエラーが発生しなくなりました。
Support Django 1.7 migrations · stephenmcd/mezzanine@ebbe66f

現状の最新 Version の Mezzanine 4.2.3 で同様のオペレーションをすると以下のエラーが発生します。1

IOError: [Errno 36] File name too long: '/var/xxx/templates/blog/blog_post_detail_\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82.html'
ERROR 2017-11-04 22:52:20,680 exception 12366 140352274904832 Internal Server Error: /blog/ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ/
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 42, in inner
    response = get_response(request)
  File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 217, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 215, in _get_response
    response = response.render()


対応方法

以下の2つがあります。

記事を削除する

日本語タイトルを短くしただけだとエラーは解消されず、1度記事を削除してから、
短いタイトルで作成しなおす必要があります。

メタデータ欄から URL を変更する

Mezzanine はデフォルトで Blog 投稿から記事タイトルから URL を生成します。
この URL は投稿画面のメタデータ欄から変更できます。

  • ブログ投稿画面

ブログ投稿画面

  • メタデータ欄押下後

メタデータ編集

SEO 対策で キーワード、 Description を設定していく場合も、このメタデータ欄から設定することができます。
以上です。


  1. ファイル名が長すぎるというエラーになります。 

コメント