python之web框架django

本文深入解析Django框架,涵盖Web服务器、应用服务器、Web应用框架的概念,详细介绍了Django的特性、架构、开发流程及实战案例,适合初学者快速入门。
部署运行你感兴趣的模型镜像

        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

  • Zend framework
  • CakePHP
  • Yii
  • ThinkPHP
  • symfony
  • kohanaphp
  • Seagull
  • Drupal
  • CodeIgniter

Python

  • django
  • pinax
  • Grok
  • Pylons
  • TurboGears
  • web2py
  • Zope
  • Quixote
  • snakelets
  • snakelets
  • PylonsHQ
  • Tornado

javascript

  • jQuery
  • MooTools
  • prototype
  • dojo
  • zk
  • Backbone.js
  • SproutCore
  • Sammy.js
  • Spine.js
  • Cappuccino
  • Knockout.js
  • Javascript MVC
  • GWT(Google Web Toolkit)
  • Google Closure
  • Ember.js
  • Angular.js
  • Batman.js
  • ExtJS

JAVA

  • Spring
  • Hibernate
  • Grails
  • Tapestry
  • ZK
  • SpringMVC
  • Struts2
  • Struts
  • Mybatis

Ruby

  • Ruby On Rails
  • Sinatra

.net

  • mvc
  • 三层
  • nhibernate

下面就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 基础教程

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaomu_347

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值