准备
首先,我们打开雨云官网。
然后我们注册一个账号,注册并登录好后,我们找到主面版的云服务器,然后点击购买云服务器。
配置我们2h2g就足够了,因为我们的流量不是那么大……操作系统推荐选Ubuntu,预装选择MCSM。
为什么要用游戏面板呢?我们做的不是网站APP吗?
这是因为,我们需要进行进程守护,如果不守护,那么APP将在SSH断开连接时终止。
购买好后,会跳转到服务器列表,我们在这里找到你刚刚买的服务器,点击管理。
找到远程连接这一栏,可以看到以下信息:
然后打开你喜欢的SSH连接软件(诸如PuTTY,Xterminal,或者是Win10自带的SSH工具都可以),按照提供的账号密码登录SSH。
什么?你说密码太~长了不好记?
可以尝试修改密码哦~
不过雨云怎么又加了一个不能有连续字符的可爱要求啊
登录好后,我们先更新以下环境,以免出现玄学的错误。
在SSH中输入:
apt update
apt upgrade
如果出现了A reboot required
之类的消息(白字),就在雨云面板选择“重启”,然后重连SSH就好啦!
然后安装本期教程用到的环境:
# django
pip install django
如果提示了Command not found
,那就先输入
apt install python3-pip
再进行安装。
正式部署!
首先,我们使用Django的命令行工具创建一个新的项目:
django-admin startproject forum
然后创建一个APP(不同于项目哦):
cd forum
python3 manage.py startapp discussion
然后cd discussion
,使用nano
orvim
之类的工具打开models.py
并编辑:
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User,on_delete=models.CASCADE)
def __str__(self):
return self.title
class Comment(models.Model):
post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name="comments")
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User,on_delete=models.CASCADE)
def __str__(self):
return f"Comment by {self.author.username} on {self.post.title}"
这样,大概的后端逻辑就做好了。
然后是前端,编辑的文件是views.py
,在models.py
所处的文件夹下:
from django.shortcuts import render,get_object_or_404,redirect
from .models import Post,Comment
from .forms import PostForm,CommentForm
from django.contrib.auth.decorators import login_required
@login_required
def post_list(request):
post = Post.objects.all()
return render(request,"discussion/post_list.html",{"posts":posts})
@login_required
def post_detail(request,pk):
post = get_object_or_404(Post,pk=pk)
comments = post.comments.all()
if request.method == "POST":
comment_form = CommentForm(request.POST)
if comment_form.is_valid():
new_comment = comment_form.save(commit=False)
new_comment.post = post
new_comment.author = request.user
new_comment.save()
return redirect("post_detail",pk=host.pk)
else:
comment_form = CommentForm()
return render(request,"discussion/post_detail.html",{"post":post,"comments":comments,"new_comment":new_comment,"comment_form":comment_form})
@login_required
def post_new(request):
if request.method == "POST"
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect("post_detail",pk=post.pk)
else:
form = PostForm()
return render(request,"discussion/post_edit.html",{"form":form})
然后,我们需要配置网站的URL,以便django识别:(编辑forum/urls.py
)
from django.contrib import admin
from django.urls import include,path
urlpatterns = [
path("admin/",admin.site.urls),
path("discussion/",include("discussion.urls")),
编辑discussion/urls.py
:
from django.urls import path
from . import views
urlpatterns = [
path("",views.post_list,name="post_list"),
path("post/<int:pk>/",views.post_detail,name="post_detail"),
path("post/new/",views.post_new,name="post_new"),
]
然后就是创建前端页面了,在discussion
目录下创建templates/discussion
创建post_list.html
post_detail.html
post_edit.html
。这些其实都比较简单,也不用加Django标识符
(maybe)。
我们还可以让用户支持使用Markdown格式的帖子。还是在SSH里面输入:
pip install markdown
然后,在views.py
中添加一个函数来渲染Markdown:
import markdown
def markdownify(text):
return markdown.markdown(text)
在HTML文件中,就可以这样(花括号是Django的文档标识符):
<div class="post-content">
{{ post.content|markdownify|safe }}
</div>
此外,我们还可以用django的内置用户认证系统来管理用户和帖子。在admin.py
文件中编辑:
from django.contrib import admin
from .models import Post,Comment
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ("title","author","created_at")
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
list_display = ("post","author","created_at")
然后可以用django的createsuperuser
来创建admin用户,进而用过django内置管理界面来管理了。
搭建好后,我们在MCSM创建一个控制台实例,不需要预装,然后cd到manage.py
所在目录,先 migrate,然后输入:
python3 manage.py runserver 8000
然后你就可以通过http://你的服务器IP:8000
来访问了!
拓展
限于篇幅,还有一些功能没有展示,如:
- 编辑帖子
- 删除帖子
- 搜索帖子
…
可以用Nginx反代80端口;
还可以用Cloudflare Turnstile(比ReCaptcha要好)服务,进行人机验证来防止灌水。
SUB PLZ