本文将叙述基于代理软件nginx和web开发框架django搭建个人网站的过程中涉及到的技术,以实现用户登陆该网站后的图片、视频分享及留言互动功能。
- 网站开发所采用的Nginx服务,是一款能实现请求分发,负载均衡和动静分离等功能的代理软件,用户请求目的网站时将先经过nginx再跳转至web应用。
- Django框架则是用python语言开发,已封装好的便于使用的web开发工具,基于该框架的web开发将围绕MVT这一理念进行,M(Model,模型)对应的是与后台数据库进行映射的模型类,V(Views,视图)是接收请求后对后台数据库进行操作,并返回数据给前端展示的函数,T(Template,模板)则是对前端页面的设计。将网站搭建划分为MVT三大块,能更好地对项目进行解耦,以便开发者在开发过程中理清思路和项目在未来的扩展。
本文所搭网站所实现的功能,及网站前后端所用技术栈,分别由以下左右两图所示
下面将对网站搭建的关键技术和功能按照以下目录分别进行详述。
目录
1. Nginx配置
Nginx的配置通过修改配置文件(通常为nginx.conf)实现,配置文件包括三大模块:全局块,events块和http块。我们主要关注http块中server块的配置,一个server块对应着一台应用服务器,其中的location块定义了对某些路由的处理。一个server模块的配置示例如下
server {
#nginx的监听端口(ipv4)
listen 80 default_server;
#nginx的监听端口(ipv6)
listen [::]:80 default_server;
#web应用的域名
server_name www.mywebsite.com;
#包含nginx欢迎页面和错误页面的文件夹路径
root /usr/share/nginx/html;
#web应用下 / 的路由匹配
location / {
#proxy_pass表示将请求转发到以下web应用服务器的ip地址及端口
proxy_pass http://127.0.0.1:8000;
}
#web应用下 /static/ 的路由匹配
location /static/ {
#alias表示将路由中的"https://www.mywebsite.com/static/"替换为以下nginx服务器上的路径,实现静态文件
#直接从nginx所在服务器获取,减轻web应用服务器的压力
alias /home/admin/application/static/;
}
#错误页面的路由匹配
error_page 404 /404.html;
location = /40x.html {
}
#错误页面的路由匹配
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
2. Django项目
基于django框架的Web项目可被划分为配置部分和应用部分。配置部分给定了项目的路径,所包含的应用,数据库的属性,模板的路径等信息,也给出了url路由的第一级匹配;应用部分则根据网站的功能进行划分,不同的功能块由不同的应用模块实现。
2.1 项目开发
- 项目创建:在python环境中安装了django框架以后,可用以下命令创建一个web应用项目
django-admin createproject myProject
该命令将会创建一个项目文件夹/myProject/以及文件manage.py。
- 项目配置:项目配置文件夹是创建项目时项目下已有的一个同名python包。该python包中的关键文件为settings.py以及urls.py。
settins.py文件中包含了项目路径,访问权限,调试模式,所采用的数据库,模板文件路径,所创建的应用,所采用的中间件,异步框架celery,网站API搭建工具rest_framework等配置信息。相关配置变量的示例如下
import os
#项目的绝对地址
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#是否处于调试模式(调试模式会在出错网页上显示具体的错误信息)
DEBUG = True
#允许访问的ip地址
ALLOWED_HOSTS = ['*']
#所定义的的应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
#用户创建的应用
'myApp1',
'myApp2',
'myApp3',
]
#中间件信息
MIDDLEWARE = [
'utils.middleware.RunTimeMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'utils.middleware.XForwardedForMiddleware'
]
#第一级url定义的所在的文件
ROOT_URLCONF = 'myProject.urls'
#模板文件信息
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'tempplate')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
#所采用的数据库信息
DATABASES = {
'default': {
'NAME': 'core',
'HOST': DATABASE_IP,
'ENGINE': 'django.db.backends.mysql',
'USER': DATABASE_USER,
'PASSWORD': DATABASE_PASSWORD,
'port': '3306'
}
}
另外可将数据库的用户名,密码等隐私信息置于secret_settings.py中并通过
from configs.secret_settings import *
引入到setting.py文件中。
urls.py文件即是settings.py种ROOT_URLCONF变量所指向的文件。在该文件中,列出了在网站域名后可匹配的第一级url,语法实例如下
urlpatterns = [
#主页对应的视图类
url(r'^$', IndexDetail.as_view()),
#myApp1.api_urls中定义了下一级url匹配情况
url('^api/', include('myApp1.api_urls')),
#myApp1.urls中定义了下一级url匹配情况
url('App1/', include('myApp1.urls')),
]
其中include()中为下一级url匹配的文件,若没有下一级匹配,则可写上所对应的视图函数。
- 项目调试:本地调试命令如下
python manage.py runserver -h 127.0.0.1 -p 8000
- 项目部署:
2.2 应用开发
在web项目开发过程中,通常将其划分为不同功能的应用,以实现功能的解耦及可扩展和可重用。
- 应用创建:命令如下
python manage.py startapp myApp
应用创建完毕后,将会在项目目录下生成一个/myApp/文件夹,即pythoh包。
- 文件关系:一个应用模块对应项目根目录下的一个python包,开发者在其中的创建的文件可按照框架的MVT理念划分为模型文件(按照惯例命名为models.py),视图文件(按照惯例命名为views.py)和模板文件(即html文件,不同应用的模板文件统一放在项目文件夹下的/templates/文件夹,可按照应用再划分文件夹),以及给出url匹配规则及与视图的对应关系的文件(按照惯例命名为urls.py)。用户除了请求url时的方式可分为GET,POST,DELETE等,通过GET方式发起的HTML请求和对应的处理放在urls.py及views.py中,其响应为HTML内容,而通过POST或DELETE等方式发起的请求,通常由页面表单或其它有数据交互元素的点击触发,其目的通常是数据的增删改,返回的是Json格式的数据,因此其对应的请求和处理放在api_urls.py及api_view.py中。这三种文件间的交互关系如下图所示
- models.py:该文件中定义了与数据库中的表一一映射的模型类。
- urls.py/api_urls.py:该文件中定义了url的可匹配项及其对应的视图函数。
- views.py/api_views.py:对指定url的http请求做出响应的逻辑过程。
- HTML文件:htttp响应的文件。该文件中可包括HTML页面设计语言,css页面样式,以及JS,JQuery,vue等定义页面交互功能的代码。
了解了应用中需要开发的不同功能的文件及其相互关系后,下面将分别叙述本文所搭网站的用户登陆,图片分享,视频分享,留言这四种应用的具体功能实现。
2.2.1 用户登陆
用户的注册和登陆是本网站设计过程中最先需要考虑的一环,所有内容浏览,资源上传等其它操作都需要以已注册用户的身份进行,本依据用户身份划定操作权限。下面将详述实现用户注册和登陆的核心过程
- 用户注册:下面将讲解用户注册时从在网页上填写及提交信息,注册成功则返回登陆页面,注册不成功则报错这一过程中,从前端发起请求,到后端处理,再到返回前端页面的核心代码。
从前端——用户注册页面开始,在HTML文件signup.html中,输入框的表单如下
<form action="signin.html">
{% verbatim myblock %}
<div class="form-group">
<label for="signin_form">账号 <span style="color:red"> {
{account_err}}</span></label>
<input type="email" class="form-control" id="username" placeholder="账号" required="required">
</div><!--/.form-group -->
<div class="form-group">
<label for="signin_form">邮箱{
{email_err}}</label>
<input type="email" class