类视图的CSRF验证
为了防止跨域攻击,Django引入了CSRF验证,凡是POST请求,都需要验证通过后才能与服务器交互。CSRF验证需要前后端共同实现。
前端添加CSRF验证仅需要在<form></form>标签内添加{% csrf_token %}即可。在返回网页时,Django会自动将其替换成value="csrf信息"的input标签。
后端分两种情况,一种为url引用的方法,另一种为url引用的类试图如Example.as_view( )。这两种情况引入CSRF验证的方法也不一样。
对于方法,仅需要在方法前添加装饰器:@csrf_exempt即可,例如:
@csrf_exempt
def example(request):
"""方法实现"""
return xxx
对于类视图,则需要使用csrf_exempt(Example.as_view( ))将其包裹例如:
urlpatterns = [
path('example/', csrf_exempt(views.Example.as_view()), name='example'), # 路由
]
阿里云服务器发送邮件
在配置博客的时候,在这里踩了一个坑。阿里云服务器屏蔽了25端口,所以所有配置成25端口的SMTP邮箱都会出现响应超时的情况,最后把它改成465端口才解决这个问题。
文章的自动保存
文章自动保存功能以上线,每1min文章就会自动保存一次。
为了实现文章自动保存的功能,我将原先的create方法和update方法合并在了一起,形成了operations方法。
原代码在新建文章时,所有的数据都保存在前端,只有前端发出POST请求时,才new article进行存储。现在新建文章时,会先new一个article对象,再进行后续的操作。因此,网页模板从原先的create.html和update.html变成了现在仅有一个update.html。新的article对象保存和发布使用的同一个方法,通过传入is_save参数判断是需要保存,还是需要发布。未发布的文章,通过is_show判断其是否该显示在列表。
不知道是因为jq的bug还是什么原因,Ajax发送请求时,只要发送了经过.replace( )处理了的数据,前端就会报错。因此也只能将标签多分隔符的功能给转到后端去了。
小BUG:因在article.modle中设置了title、body不可为空,所以在title或body其中一个为空时,文章无法正确保存。后续会对其进行修改,同时也会涉及到后续提交文章时对title、body的判断。(已于文章发布当晚处理完成。设置title、body可为空,改为在发布时检查是否为空,为空则不允许发布)
文章及评论显示头像
在文章及评论中添加了头像显示,具体实现非常简单,就不过多赘述。此外,还有个人信息卡没有合理的利用起来,后续考虑增加相关功能。
在实现这个功能时,我顺带更改了头像上传后的处理方式。原先头像上传后会将其短边缩放成60px,考虑到头像只使用方形,故此现在的处理逻辑,时将图片缩放后,从中间截取60x60的正方形。便于数据的轻量化,加快网页的加载。
此外,考虑到个人博客人流量较小(有一部分我禁止了未登录访问的原因),我将个人头像的文件名固定,每当上传新头像时,旧头像就会被删除,降低了服务器的空间占用,也方便检索个人头像。
ckeditor工具栏更改
事实证明,我昨天的想法是非常可行的,通过js的.after( )方法,我将保存和发布按钮添加到了文章的工具栏上,同时保存按钮兼具了保存状态的显示。
我以前是比较抗拒js的学习的,通过这几天使用js编辑前端界面、发送ajax请求等,我觉得我大概是了解js脚本的写法了。js代码整体和Java差不了多少,只是面向的对象不一样,一些方法始终是有些不同。
快捷键的添加
监听用户的键盘输入就可以实现快捷键功能,代码模板如下:
$(window).keydown(function(e) { // 此处使用Jquery选择器
if (e.keyCode === 83 && e.ctrlKey) { // 根据按键ASCII码判断用户按下的案件
e.preventDefault(); // 禁止浏览器响应快捷键(浏览器会响应Ctrl+S保存HTML文件)
saveArticle(); // 检测到快捷键被按下后的方法
}
});
结合前边修改ckeditor工具栏的内容,在元素中添加属性data-cke-tooltip-text="保存(Ctrl+S)"即可在鼠标悬浮在按钮上时进行提示(此处使用ckeditor自有功能)。
最后附上键盘按键对应的ASCII 编码:
功能键 | A~Z | ||||
常数 | 值 | 描述 | 常数 | 值 | 描述 |
vbKeyLButton | 0x1 | 鼠标左键 | vbKeyA | 65 | A 键 |
vbKeyRButton | 0x2 | 鼠标右键 | vbKeyB | 66 | B 键 |
vbKeyCancel | 0x3 | CANCEL 键 | vbKeyC | 67 | C 键 |
vbKeyMButton | 0x4 | 鼠标中键 | vbKeyD | 68 | D 键 |
vbKeyBack | 0x8 | BACKSPACE 键 | vbKeyE | 69 | E 键 |
vbKeyTab | 0x9 | TAB 键 | vbKeyF | 70 | F 键 |
vbKeyClear | 0xC | CLEAR 键 | vbKeyG | 71 | G 键 |
vbKeyReturn | 0xD | ENTER 键 | vbKeyH | 72 | H 键 |
vbKeyShift | 0x10 | SHIFT 键 | vbKeyI | 73 | I 键 |
vbKeyControl | 0x11 | CTRL 键 | vbKeyJ | 74 | J 键 |
vbKeyMenu | 0x12 | MENU 键 | vbKeyK | 75 | K 键 |
vbKeyPause | 0x13 | PAUSE 键 | vbKeyL | 76 | L 键 |
vbKeyCapital | 0x14 | CAPS LOCK 键 | vbKeyM | 77 | M 键 |
vbKeyEscape | 0x1B | ESC 键 | vbKeyN | 78 | N 键 |
vbKeySpace | 0x20 | SPACEBAR 键 | vbKeyO | 79 | O 键 |
vbKeyPageUp | 0x21 | PAGE UP 键 | vbKeyP | 80 | P 键 |
vbKeyPageDown | 0x22 | PAGE DOWN 键 | vbKeyQ | 81 | Q 键 |
vbKeyEnd | 0x23 | END 键 | vbKeyR | 82 | R 键 |
vbKeyHome | 0x24 | HOME 键 | vbKeyS | 83 | S 键 |
vbKeyLeft | 0x25 | LEFT ARROW 键 | vbKeyT | 84 | T 键 |
vbKeyUp | 0x26 | UP ARROW 键 | vbKeyU | 85 | U 键 |
vbKeyRight | 0x27 | RIGHT ARROW 键 | vbKeyV | 86 | V 键 |
vbKeyDown | 0x28 | DOWN ARROW 键 | vbKeyW | 87 | W 键 |
vbKeySelect | 0x29 | SELECT 键 | vbKeyX | 88 | X 键 |
vbKeyPrint | 0x2A | PRINT SCREEN 键 | vbKeyY | 89 | Y 键 |
vbKeyExecute | 0x2B | EXECUTE 键 | vbKeyZ | 90 | Z 键 |
vbKeySnapshot | 0x2C | SNAPSHOT 键 | 下列常数代表数字键盘上的键: | ||
vbKeyInsert | 0x2D | INSERT 键 | 常数 | 值 | 描述 |
vbKeyDelete | 0x2E | DELETE 键 | vbKeyNumpad0 | 0x60 | 0 键 |
vbKeyHelp | 0x2F | HELP 键 | vbKeyNumpad1 | 0x61 | 1 键 |
vbKeyNumlock | 0x90 | NUM LOCK 键 | vbKeyNumpad2 | 0x62 | 2 键 |
下列常数代表功能键: | vbKeyNumpad3 | 0x63 | 3 键 | ||
常数 | 值 | 描述 | vbKeyNumpad4 | 0x64 | 4 键 |
vbKeyF1 | 0x70 | F1 键 | vbKeyNumpad5 | 0x65 | 5 键 |
vbKeyF2 | 0x71 | F2 键 | vbKeyNumpad6 | 0x66 | 6 键 |
vbKeyF3 | 0x72 | F3 键 | vbKeyNumpad7 | 0x67 | 7 键 |
vbKeyF4 | 0x73 | F4 键 | vbKeyNumpad8 | 0x68 | 8 键 |
vbKeyF5 | 0x74 | F5 键 | vbKeyNumpad9 | 0x69 | 9 键 |
vbKeyF6 | 0x75 | F6 键 | vbKeyMultiply | 0x6A | MULTIPLICATION SIGN (*) 键 |
vbKeyF7 | 0x76 | F7 键 | vbKeyAdd | 0x6B | PLUS SIGN (+) 键 |
vbKeyF8 | 0x77 | F8 键 | vbKeySeparator | 0x6C | ENTER 键 |
vbKeyF9 | 0x78 | F9 键 | vbKeySubtract | 0x6D | MINUS SIGN (-) 键 |
vbKeyF10 | 0x79 | F10 键 | vbKeyDecimal | 0x6E | DECIMAL POINT (.) 键 |
vbKeyF11 | 0x7A | F11 键 | vbKeyDivide | 0x6F | DIVISION SIGN (/) 键 |
vbKeyF12 | 0x7B | F12 键 | vbKey1 | 49 | 1 键 |
vbKeyF13 | 0x7C | F13 键 | vbKey2 | 50 | 2 键 |
vbKeyF14 | 0x7D | F14 键 | vbKey3 | 51 | 3 键 |
vbKeyF15 | 0x7E | F15 键 | vbKey4 | 52 | 4 键 |
vbKeyF16 | 0x7F | F16 键 | vbKey5 | 53 | 5 键 |
0~9键 | vbKey6 | 54 | 6 键 | ||
常数 | 值 | 描述 | vbKey7 | 55 | 7 键 |
vbKey0 | 48 | 0 键 | vbKey8 | 56 | 8 键 |
vbKey9 | 57 | 9 键 |