在我的上一篇博客写了些在建站的过程中,阿里云服务器的选择,以及服务器环境配置时遇到的坑。
本篇打算分享一下在使用Django后的感受,以及搭建网站后台管理员界面(admin.py)时遇到的问题。
1 Django使用后感受
使用之后的第一个感觉就是Django的组成很简单。
- 首先,其规定了html、css、js等文件的存放位置(template、static等);
- 其次,其规定了后台响应程序(views)、数据库连接(models)、管理员界面(admin)以及配置设置(setting)等coding位置;
- 最后,从生成应用文件(app),以我这里的app名称'pageContent'为例:
python manage.py startapp pageContent
到运行网站
python manage.py runserver
以及自动生成数据库models,迁移数据库信息(migrate)等都是都是使用manage.py进行的,有一拳超人走天下的感觉。
Terminal中直接输入以下可以了解更多。
python manage.py
此外,项目可以使用Pycharm的Django项目自动生成,如图1 所示(图丑求轻喷)。
![](https://i-blog.csdnimg.cn/blog_migrate/797758a491d58e55b7126dbdaa1ab5a6.png)
第二个是能感受到Django结构的严格限制。Django的Project文件命名有严格的要求,如“template”就是用来存放html页面的、“static”(静态)指的是可以被静态文件的形式访问,可以直接通过url中加入‘/static/+文件名’直接访问,我导的任务之一是下载一个文件,我这边实现起来就是先把文件放到static下的doc文件夹中(/static/doc/xxx.doc)加上链接<a>进行访问并下载。放到其他非static文件夹就不行了。总之,像“template”、“static”的文件名都不要改名使用。
人类制定了规则,规则又回来反制人类,妙啊
2 收获到的一篮子知识点
2.1 INSTALLED_APPS加入app名称
添加app的名称在setting.py文件中的INSTALLED_APPS配置列表里:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'pageContent', # 我的app名称 要加入进来
]
我这里的app名称是'pageContent',如果这里不加入,后面自动生成数据库models会遇到bug。好习惯随手养成。
2.2 html中涉及到表单提交需要添加“{%csrf_token%}”
添加这个标签目的是防止csrf(跨站请求伪造),即防止黑客盗用我网站上的cookies内容。
在渲染模板的时候,Django可以把这句{%csrf_token%}替换成一个<input type="hidden",name="csrfmiddlewaretoken", value=xxxxx(一个随机的token)>元素,提交表单内容的时候完成加密。
更多可以参见:Django的csrf保护机制
添加的位置为form标签下数第一行的位置,样例如下 :
<form enctype="multipart/form-data" id="form02" method="post">
{%csrf_token%}
<div class="inner"..(省略表单内容部结构)..><input type="hidden" name="id" value="form02">
</form>
2.3 Django自带管理员界面的生成
生成管理员界面需要预先把数据库相关内容配置好,下面是我配置的过程:
# 刷新数据库的信息
python manage.py makemigrations
python manage.py migrate
python manage.py inspectdb > pageContent/models.py
# 创建管理员账号
python manage.py createsuperuser
有关makemigrations和migrate的原理可以参考官方文档:更多关于迁移(migrate)的理解
然后需要在admin.py中进行编程,开启管理员的界面。
2.4 Django管理员界面对后台数据库中数据的管理(增删改查以外等花里古哨的功能)
from django.contrib import admin # 引入管理员界面继承的包
from django.utils.html import format_html
from pageContent.models import Userapp # 存放我后台的数据库表名 Userapp
# 管理员界面入口
"""
MessageAdmin
"""
class MessageAdmin(admin.ModelAdmin):
"""
希望能在管理员界面直接看到我的Userapp表中的这三列内容,其中id、date是列名,和我数据库中表的列名需相同。View是我生成的列名,详细见View内置函数的解释。
"""
list_display = ('id','date', 'View',)
search_fields = ('id','date',) # 界面内增加检索框,检索的字段范围为 id date,需要什么加什么
list_per_page = 20 # 一页可以展示的数量,此处20
ordering = ('id',) # 排序的依据,此处升序排列,加一个负号,'-id'改为降序排列
list_filter = ('date',) # 增加一个侧边栏,进行时间范围的筛选
date_hierarchy = 'date' # 增加一行可以用于选择具体日期
"""
可以在页面中加入html标签,此处的功能:
将数据库中的'filepath'列中的pdf文件位置信息 作为超链接a标签渲染到页面中
使管理员通过点击'查看'能直接跳转文件预览页面(或者跳出文件下载链接)
"""
def View(self, obj):
return format_html("<a href='{0}'>查看</a>", obj.filepath)
View.allow_tags = True # 加入
admin.site.site_header = '我的管理员界面' # 修改登陆页面登陆框上的名字
admin.site.site_title = '我的管理员界面' # 修改页面标题
admin.site.register(Userapp, MessageAdmin) # 上面的功能加入到Userapp表中
效果如图2所示:
![](https://i-blog.csdnimg.cn/blog_migrate/29608c3a8b78b7569167d46ab4bb10d0.png)
更多功能可以参考文档:Django Admin界面介绍
2.5 运行Django后台不止runserver
我们使用python manage.py runserver一般会开启8000端口,这样我们通过访问http://localhost:8000就可以访问了。
但是我们平时访问的网站很少有带':8000'的情况,这是为什么呢?
因为他们开启了http协议的默认端口,即80端口。(百度百科80端口)
我们在布置我们的网站的时候想使用默认端口只需要将run语句修改如下:
python manage.py runserver 0.0.0.0:80
在浏览器中输入'localhost'就可以访问了。
2.6 DEBUG=False后admin界面格式错误或加载不出
Django自带debug功能(setting.py中),可以不用我们自己写404等页面,在出错时跳转至默认页面。
开启True的效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cc03232c6b952ad373372e7011ffafc1.png)
改成False效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/2e1640b1639113c137ba524fe1dfa565.png)
但是由于我们将DEBUG改成了False,会导致Admin界面发生格式加载错误的现象,如图5所示:
![](https://i-blog.csdnimg.cn/blog_migrate/cdd39a1375027da58e334fc3f802b27d.png)
怎么修改呢?
需要在run的时候再加一点内容:
python manage.py runserver 0.0.0.0:80 --insecure
加入'--insecure' 即可,刷新,熟悉的页面回来了:
![](https://i-blog.csdnimg.cn/blog_migrate/09a37f7f5410901a831b73a22497772b.png)
如果你是在服务器上运行的,那么就可以直接在其他电脑上浏览器访问服务器的ip号来获取页面了。
不过没有经过备案可能一两个小时就会被封掉,试试就好,安心等备案吧。
小结
本文没有涉及到有关数据库在setting中是如何配置的,具体操作可以很容易的搜到,在此不赘述。
此外,Django自带的admin界面还可以pip一些suit来美化,django-suit·PyPI,当然大家也可以自己探索一番。
道路千万条,实现网站的方法很多。这一周我用Django搭建了一个有管理员后台的网站,收益颇丰。我又回想起四年前(我大二上学期)的那个夜晚,我用JSP在赶一个后台,厚重的Java框架,复杂的xml的配置,给我和我的小伙伴留下了挥之不去的心理阴影。直到现在,我还记得我那时的慌张与无措。好在,现在开源的框架越来越轻量,调用越来越简便,但是,这种代码量解放的同时,又有多少人被奴役进来了呢?
总之,管理员界面就这样缝缝补补的建起来了。整个网站的搭建也算是告一段落。
后续还有很多要完善的地方,我要拉着我的小伙伴对需求去了,告辞。