[云服务器9]使用django搭建论坛网站?

准备

首先,我们打开雨云官网

然后我们注册一个账号,注册并登录好后,我们找到主面版的云服务器,然后点击购买云服务器




配置我们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,使用nanoorvim之类的工具打开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来访问了!

拓展

限于篇幅,还有一些功能没有展示,如:

  1. 编辑帖子
  2. 删除帖子
  3. 搜索帖子

可以用Nginx反代80端口;

还可以用Cloudflare Turnstile(比ReCaptcha要好)服务,进行人机验证来防止灌水。

SUB PLZ

不是,有个东西叫tmux,还有个东西叫supervisor

所以我的下一篇文章