Web服务器和应用服务器以及web应用框架:
web服务器:负责处理http请求,响应静态文件,常见的有 Apache, Nginx 以及微软的 IIS 等.
应用服务器:负责处理逻辑的服务器。比如Java、php 、Python 的代码,是不能直接通过 Nginx 这种web服务器来处理的,只能通过应用服务器来处理,常见的应用服务器有 uwsgi 、 tomcat 等。
web应用框架:一般使用某种语言,封装了常用的 web 功能的框架就是web应用框架, flask 、 Django 以及Java中的 SSM(Spring+SpringMVC+MyBatis) 等框架都是web应用框架。
一般开发一个web项目,首先考虑的就是web服务器架构选择(LAMP或者LNMP等),接下来才是针对模块进行开发。
Web应用框架(Web application framework)是一种开发框架,用来支持动态网站、网络应用程序及网络服务的开发。其类型有基于请求的和基于组件的两种框架,前者的代表有Struts和Spring MVC等,后者的成员则有JSF、Tapestry等等,常见的架构有MVC和CMS两种。Web应用框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口、标准样板以及会话管理等,可提升代码的可再用性。
常用的web开发框架根据不同语言罗列如下:
PHP |
| Python | |
javascript |
| JAVA |
|
Ruby |
| .net |
|
下面就python中常用的django框架进行阐述。
(1)初步了解Django
Django是用python语言写的开源web开发框架,并遵循MVC设计,对比同源的Flask框架,Django原生提供了众多的功能组件,让开发更简便快速。其具有以下特点,
- 封装:大量的功能封装
- 简化:把相对复杂的功能进行封装后做到简化
- 优化:后台py代码优化提升效率
- 漏洞:弥补了已知网站传输漏洞,如sql注入
- 管理:框架以模块划分,分别负责不同的功能,清晰易于管理
Django遵循的MVC设计与传统的MVC结构存在一定差异,故也常常被称为MTV结构

其整个流程如下,

利用django开始构建一个工程,具体操作如下,

具体的指令如下
创建项目:django-admin startproject mainproject
创建APP(进入项目目录):python manage.py startapp firstWEB
创建库表(进入项目目录):python manage.py makemigrations
执行库表建立(进入项目目录):python manage.py migrate
创建超级管理者(及设置admin登录账号和密码):python manage.py createsuperuser
启动django项目:python manage.py runserver
模板渲染嵌入语法:在html中可以嵌入后台语言 区分符号为 {%命令%} {{变量}}
需要注意的是,如果想嵌入for循环,需要在结束后添加{%endfor%},如
{% for data in datas %}
<tr>
<td>{{ data.value_a }}</td>
<td>{{ data.value_b }}</td>
<td>{{ data.result }}</td>
</tr>
{% endfor %}
建好后,项目目录如下

其结构如下(大同小异),mainproject是一个项目,firstWEB是项目下的应用之一,可以使用创建命令创建更多的应用。
- 其中mainproject项目文件夹和其下的mainproject文件夹: 执行
django-admin startproject mainproject创建项目时自动创建 - manage.py: 同上也是执行django-admin startproject mainproject时自动创建,它是django的任务管理命令行工具。
- firstWEB文件夹和migrations文件夹: 是执行
python manage.py startapp firstWEB创建应用时自动创建。 - db.sqlite3: 是创建应用,简单运行后自动添加的sqlite3数据库,在django中是默认使用这个(如需配置其配置路径为./my_site/settings.py)。
- mainproject中的settings.py: 这个文件中包括了项目的初始化设置,可以针对整个项目进行有关参数配置,比如配置数据库、添加应用等。
- mainproject中的urls.py: 这是一个总的URL配置表文件,主要是将URL映射到应用程序上。当用户请求某个URL时,django会根据这个文件夹中的映射关系指向某个目标对象,该对象可以是某个应用中的urls.py文件,也可以是某个具体的视图函数。在django中,这个文件也被称为URLconf,这是django非常强大的一个特性。
- mainproject中的wsgi.py: WSGI是 Web Server Gateway Interface缩写,它是python所选择的服务器和应用标准,django也会使用。wsgi.py定义了我们所创建的项目都是WSGI应用。
- 如果你还看到了__pycache__文件夹: 它是执行
python manage.py runserver命令时自动创建,它是一个编译后的文件夹,里面放的是一些pyc结尾的文件。 - firstWEB中的admin.py: 这个文件中可以自定义django管理工具,比如设置在管理界面能够管理的项目,或者通过重新定义与系统管理有关的类对象,向管理功能增加新的内容。
- firstWEB中的apps.py: 这个文件时django1.10之后增加的,通常里面包含对应用的配置。
- blog中的migration目录: 用于存储应用的数据表结构的指令,通过这些指令可以修改和创建数据库,从而在models.py模型类和数据库表之间迁移。
- firstWEB中的modles.py: 这是应用的数据类型,每个django应用都应当有一个 modles.py文件,虽然该文件可以为空,但不宜删除,这里就是编写模型类的地方。
- firstWEB中的tests.py: 在这个文件中可以编写测试文档来测试所建立的应用。
- firstWEB中的views.py: 这是一个重要的文件,用户保存响应各种请求的函数或者类。如果编写的是函数,则称为基于函数的视图;如果编写的是类,则称之为基于类的视图。views.py就是保存函数或者类的视图文件。当然也可以用其他的文件名称,只不过在引入响应函数或者类时,要注意名称的正确性,views.py是我们习惯使用的文件名称。
- 配置模板的路径,即template文件夹,这一般为自己手动建立,可放在应用文件夹下也可以放在外面,主要用来存放前端的html文件。使用时需要在项目的setting.py文件中进行配置。
- 配置静态目录,即static文件夹,同样需要手动创建,主要存放css和js这些静态文件,在setting.py中进行设置。
(2)实例
此次实例是以b站up主的教程为例,主要完成以下功能:
- 新建一个django工程
- 创建一个app,即生成一个网站
- 创建model,创建数据表(库,有几个简单的字段)
- 创建一个渲染模板页面并需要完成一个运算功能(加法)
- 每次运算结果保存起来
- 通过model读取全部的运算结果
- 前端页面呈现数据库里的结果
- 前端加一个清库功能,一键删除数据库内容
》首先前期的环境准备在这里就不赘述了,通过anaconda安装虚拟环境和django库,这里我使用的是win10下python3.7,django2.2, pycharm进行开发配置的 ,接着按照上面新建项目和app的方法,对此进行一一构建,同时添加一个template文件夹,用于存放前端html文件,最后效果如下,

接下来我们需要做的是在setting.py文件中做如下修改

如果同时想要修改语言与时区,可同时在setting.py中进行如下修改
LANGUAGE_CODE = 'zh-Hans' ###en-us 修改为中文
TIME_ZONE = 'Asia/Shanghai' ##UTC修改为中国时间
这个时候如果无误的话,启动项目,在浏览器中输入http://127.0.0.1:8000/会出现以下页面,即表示初步建立成功。

》接下来,需要做的就是添加页面与逻辑功能,同时关联其前后端操作
首先在firstWEB文件夹下的views.py文件中,添加逻辑函数
from django.shortcuts import render
from firstWEB.models import *
from django.http import HttpResponse
# Create your views here.
def index(request):
return render(request,'index.html')
这句话就是告诉渲染index.html文件,接着在新建的template文件夹下添加一个index.html文件,里面内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>my first web from django</title>
</head>
<body>
<h1 style="color:red">my first django website</h1>
</body>
</html>
最后需要做的就是告诉router路由进行映射,在项目文件下的urls.py文件中添加如下内容
from django.contrib import admin
from django.urls import path ##django 1.x版本用的是url来正则匹配,后面版本直接用path来实现
from firstWEB import views
urlpatterns = [
path('admin/', admin.site.urls),
path('abc/',views.index) ###在这里用abc还是index都行,只是用来做映射,在网页端输入对应即可
]
这时候在去浏览器中输入http://127.0.0.1:8000/abc/,即可出现以下界面

接下来的操作同上,在views.py中分别添加计算页与返回结果页
def CalPage(request):
return render(request,'cal.html')
def Cal(request): ###返回结果
if request.POST:
value_a,value_b=request.POST["valueA"],request.POST["valueB"]
result=int(value_a)+int(value_b)
# print(value_a,value_b)
return render(request,'result.html',context={"data":result})
else:
return HttpResponse("please visit us with POST")
同时在template下添加cal.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>计算页面</title>
</head>
<body>
<form method="POST" action="/cal">
{% csrf_token %}
第一个数字:<input type="number" name="valueA">
+
第二个数字:<input type="number" name="valueB">
<input type="submit" value="提交计算">
</form>
</body>
</html>
以及result.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>结果页面</title>
</head>
<body>
<h1>计算结果是:</h1><h2>{{data}}</h2>
</body>
</html>
然后再在urls.py文件中添加对应映射即可,最后在浏览器中检验结果。
》关联数据库
最后假如我们想将结果写入到数据库中,这时候我们需要在应用项目文件夹下的models.py文件进行修改
from __future__ import unicode_literals
from django.db import models
# Create your models here.
###类似于对表的描述
class cal(models.Model):
value_a=models.CharField(max_length=10)
value_b=models.FloatField(max_length=10)
result=models.CharField(max_length=30)
然后利用以下命令来生成数据库
python manage.py makemigration
python manage.py migrate
这个时候打开数据库就可以看到建好的数据库了,然后在views.py中,我们需要将前端操作的结果写入到数据库中
- 在Cal函数中添加
###开始写入sql-lite数据库
cal.objects.create(value_a=value_a,value_b=value_b,result=result)
- 添加读取操作和删除操作
def CalList(request):
datas=cal.objects.all()
# for data in datas:
# print(data.value_a,data.value_b,data.result)
return render(request,'list.html',context={"datas":datas})
def DelData(request):
cal.objects.all().delete()
return HttpResponse('data deleted')
对应的在templates下添加list.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Cal list</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>valueA</th>
<th>valueB</th>
<th>result</th>
</tr>
</thead>
{% for data in datas %}
<tr>
<td>{{ data.value_a }}</td>
<td>{{ data.value_b }}</td>
<td>{{ data.result }}</td>
</tr>
{% endfor %}
</table>
<form action="del" method="POST">
{% csrf_token %}
<input type="submit" value="清库"></input>
</form>
</body>
</html>
然后再在urls.py中添加映射即可。最后显示的界面结果如下

点击清库后,数据库清空,页面显示data deleted。
(3)补充点
》ORM(object relationship mapping)
表示对象-关系映射的缩写,实际上就是一种把数据库映射成对象的想法
- 数据库的表(table) --> 类(class)
- 记录(record,行数据)--> 对象(object)
- 字段(field)--> 对象的属性(attribute)
比如说查询语句 SELECT id, first_name, last_name, phone, birth_date, sex FROM persons WHERE id = 10
对应到代码就是
res = db.执行数据库(sql);
name = res[0]["FIRST_NAME"];
那么ORM的写法就是
p = Person.get(10);
name = p.first_name;
这样的好处就是可以不需要了解数据库底层,因为它不需要接触SQL语句
》django
Django1.x中的正则形式去匹配链接,但是怎么匹配,网页都是弹出page not found错误,显示找不到链接,不得已的情况下将path换为了url发现网页能够正常匹配显示。通过查阅相关文档发现,Django2.x中的path不支持正则匹配,但在同一目录下的re_path与Django1.x中的url功能大部分相同可以替代url。
参考链接:
https://blog.youkuaiyun.com/Best_fish/article/details/84307045(Django框架和Tornado框架的区别)
https://www.cnblogs.com/yangmeichong/p/11303746.html(python之Djiango框架简介)
https://code.ziqiangxuetang.com/django/django-views-urls.html(Django 2.2 基础教程)

本文深入解析Django框架,涵盖Web服务器、应用服务器、Web应用框架的概念,详细介绍了Django的特性、架构、开发流程及实战案例,适合初学者快速入门。
1133

被折叠的 条评论
为什么被折叠?



