Django新手项目实例_破法者之终结的博客-程序员秘密_实例django3

技术标签: django  

1. 程序安装

(1)安装Django:

pip3 install django

(2)配置系统环境
成功安装Django后,在python目录script路径可找到django-admin.exe文件,将它加入操作系统环境变量中。这样以后调用会比较方便。
运行

django-admin help

能看到下面的内容表示安装过程OK。
在这里插入图片描述

2. 创建Django项目

新建个文件夹,cmd进入该目录,输入以下代码

django-admin startproject testdj

项目创建完毕,如下图
在这里插入图片描述

3. 创建APP

在项目根目录输入命令

python manage.py startapp login

app创建完毕如下图
在这里插入图片描述

4. 编写路由

路由是浏览器输入url,在Django服务器响应url的转发中心。路由都写在urls文件里,它将浏览器输入的url映射到相应的业务处理逻辑也就是视图。简单的urls编写方法如下图:
在这里插入图片描述

5. 编写视图函数

路由转发用户请求到视图函数。视图函数处理用户请求,也就是编写业务处理逻辑,一般都在views.py文件里。我们下面写一个简单的视图函数:

在这里插入图片描述
通过上面两个步骤,我们将index这个url指向了views里的index()视图函数,它接收用户请求,并返回一个“hello world”字符串。

6. 运行web服务

现在我们已经可以将web服务运行起来了。

命令行的方式是:

python manage.py runserver 127.0.0.1:8000

访问端口,修改一下url,添加“/index/”,就一切ok了!
在这里插入图片描述

7. 返回HTML文件

上面我们返回给用户浏览器的是什么?一个字符串!实际上这肯定不行,通常我们都是将HTML文件返回给用户。

下面,我们在templates目录中新建一个index.html文件:
代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
    <h1 style="color: black">Hello World!</h1>
</body>
</html>

在这里插入图片描述
再回到views.py文件,编辑index视图,注释当前的return语句,导入render方法,换上新的return语句:
在这里插入图片描述
为了让django知道我们的HTML文件在哪里,需要修改settings文件的相应内容。但默认情况下,它正好适用,你无需修改。
在这里插入图片描述
接下来,我们可以重新启动web服务。在浏览器刷新一下,你会看到带有样式的“Hello World”。

在这里插入图片描述
注:这里有个小技巧,在多次频繁重启服务时,可能会不能及时释放端口,容易启动不了服务,修改一下端口就OK了。

8. 使用静态文件

我们已经可以将HTML文件返还给用户了,但是这还不够,前端三大块HTML、CSS、JavaScript,还有各种插件,它们齐全才是一个完整的页面。在Django中,一般将这些静态文件放在static目录中。

接下来,在mysite中新建一个static目录。(下面导入的静态文件仅用于流程展示,并不实际使用它做点什么。)
在这里插入图片描述
你的CSS、JS和各种插件都可以放置在这个目录里。比如这里,我们又在static下新建了一个js目录,然后拷贝了一个jquery-3.2.1.min.js进来:
在这里插入图片描述
为了让Django知道这个static目录的存在,并能够找到这个目录,需要对settings.py进行配置:

STATIC_URL = '/static/'
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static')
]

现在,我们就可以在index.html中引入js文件了:
在这里插入图片描述
重新启动web服务,刷新浏览器,查看结果。当然,你啥都看不出来,因为仅仅引入了一个jqurey而已

9. 接收用户发送的数据

前面,我们将一个要素齐全的HTML文件返还给了用户浏览器。但这还不够,因为web服务器和用户之间没有动态交互。

下面我们设计一个表单,让用户输入用户名和密码,提交给index这个url,服务器将接收到这些数据。

先修改index.html文件。删除原来的内容,写入下面的内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h1>用户输入:</h1>
    <form action="/index/" method="post">
        用户名:<input type="text" name="username" /><br />
        密码:<input type="password" name="password" /><br />
        <input type="submit" value="提交" />
    </form>
</body>
</html>

在这里插入图片描述

这时候我们先不要往输入框内输入信息。我们先修改views.py文件:

from django.shortcuts import render
from django.shortcuts import HttpResponse

# Create your views here.


def index(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, password)
    return render(request, 'index.html')

因为django有一个跨站请求保护机制,这需要我们在index.html文件中加入一行{% csrf_token %}。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h1>用户输入:</h1>
    <form action="/index/" method="post">
    #下面这个代码会随机生成一个token
        {% csrf_token %}   <!--加入这行 --> 
        用户名:<input type="text" name="username" /><br />
        密码:<input type="password" name="password" /><br />
        <input type="submit" value="提交" />
    </form>
</body>
</html>

再次进入浏览器,刷新index页面,输入点东西,这次就能成功提交了,然后我们可以看到print语句打印出来的相应数据了。

10. 返回动态页面

现在,我们收到了用户的数据,但返回给用户的依然是个静态页面。通常我们会根据用户的数据,进行处理后再返回给用户。

先改造views.py文件:在这里插入图片描述

from django.shortcuts import render
from django.shortcuts import HttpResponse

# Create your views here.

user_list = []


def index(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, password)
        temp = {'user': username, 'pwd': password}
        user_list.append(temp)
    return render(request, 'index.html', {'data': user_list})

再改造index.HTML文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h1>用户输入:</h1>
    <form action="/index/" method="post">
        {% csrf_token %}   <!--加入这行 -->
        用户名:<input type="text" name="username" /><br />
        密码:<input type="password" name="password" /><br />
        <input type="submit" value="提交" />
    </form>

    <h1>用户展示:</h1>
        <table border="1">
            <thead>
                <tr>用户名</tr>
                <tr>密码</tr>
            </thead>
            <tbody>
                {% for item in data %}
                <tr>
                    <td>{
   { item.user }}</td>
                    <td>{
   { item.pwd }}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
</body>
</html>

说明:Django采用自己的模板语言,类似jinja2,根据提供的数据,替换掉HTML中的相应部分,详细语法入门后再深入学习。
接下来,重启服务,刷新浏览器,多输入几次。

在这里插入图片描述

11. 使用数据库

流程走到这里,django的MTV框架基本已经浮出水面了,只剩下最后的数据库部分了。

上面我们虽然和用户交互得很好,但并没有保存任何数据,页面一旦关闭,或服务器重启,一切都将回到原始状态。

使用数据库的需求是毫无疑问的,Django通过自带的ORM框架操作数据库,并且原生支持轻量级的sqlite3数据库。下面我们来看一看:

使用数据库前,我们需要注册app:

setting.py里修改INSTALLED_APPS,把login注册进去:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'login',
]

不注册它,你的数据库就不知道该给哪个app创建表。

然后我们在settings中,配置数据库相关的参数,如果使用sqlite3,则不需要做任何修改。
在这里插入图片描述
再编辑app中的models.py文件

from django.db import models

# Create your models here.
class UserInfo(models.Model):
    user = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    

这里我们创建了2个字段,分别保存用户的名字和密码。

接下来要在Pycharm的Teminal中通过命令创建数据库的表了。有2条命令,分别是:

python manage.py makemigrations

这会在login目录中的migrations目录中生成一个0001_initial.py迁移记录文件。

再输入命令:

python manage.py migrate

这样,我们就在数据库中将所有app的数据表都创建好了。我们可以看到项目根目录下出现了一个db.sqlite3文件:在这里插入图片描述
现在,我们来修改views.py中的业务逻辑

from django.shortcuts import render,HttpResponse
from login import models
# Create your views here.
user_list=[]
def index(request):
    if request.method=='POST':
        username=request.POST.get('username')
        password=request.POST.get('password')
        #数据保存到数据库
        models.UserInfo.objects.create(user=username,pwd=password)
     
    #数据库读取数据
    user_list=models.UserInfo.objects.all()
    print(user_list)
    return render(request,'index.html',{'data':user_list})
    


重启web服务后,刷新浏览器页面,之后和用户交互的数据都能保存到数据库中。任何时候都可以从数据库中读取数据,展示到页面上,不会因为服务器中途关闭,丢失先前的数据了。

至此,一个要素齐全,主体框架展示清晰的Django项目完成了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wojiucaonen/article/details/97787764

智能推荐

python-文件、异常处理、with else_海的天空1661的博客-程序员秘密_unpicker. load

一:文件python是跨平台,在不同操作系统下 不需要改代码直接运行 有os模块

Redis面试题_缘丶沐逸尘的博客-程序员秘密

目录一、Redis 是什么?都有哪些使用场景?二、Redis 有哪些功能?三、Redis 和 memcache 有什么区别?四、Redis 为什么是单线程的?五、什么是缓存穿透?怎么解决?六、Redis 支持的数据类型有哪些?七、Redis 支持的 Java 客户端都有哪些?八、jedis 和 Redisson 有哪些区别?九、怎么保证缓存和数据库数据的一致性?十、Redis 持久化有几种方式?十一、Redis 怎么实现分布式锁?十二、Redis 分布式锁有什么缺陷?十三、Redis 如何做内存优化?十四、

简述python中`functools.wrapper()_Jonny Jiang-zh的博客-程序员秘密_functools wrapper

简述python中functools.wrapper()首先对于最简单的函数:def a(): passif __name__ == '__main__': print(a.__name__)输出结果:a然后稍微复杂点:def a(func): def wrapper() return [email protected] b(): passif __name__ == '__main__' print(b.__name__)输出结果:a当加上functools.wrap

教你从零开始搭建一款前端脚手架工具_Web全栈开发的博客-程序员秘密

前言在实际的开发过程中,从零开始建立项目的结构是一件让人头疼的事情,所以各种各样的脚手架工具应运而生。笔者使用较多的yoeman,express-generator和vue-cli便是当中之一。它们功能丰富,但最核心的功能都是能够快速搭建一个完整的项目的结构,开发者只需要在生成的项目结构的基础上进行开发即可,非常简单高效。作为一个不折腾会死星人,在熟悉了使用方法以后就开始琢磨起它们的原理来了。...

R变成中文界面?_goldendata的博客-程序员秘密_r语言界面如何调为中文

如题,第一次按照R的默认安装,一直点击下一步,安装后发现R的界面都是英文的。如何变成中文的呢?一种解决方法是:卸载R,重新安装,安装的时候勾选“language translation message”、选择“自定义安装”,然后根据需要选择设置,安装完成后就是中文的了。

搭建本地MongoDB数据库_leafpanye的博客-程序员秘密_本地搭建mongodb数据库建库

1、去官网下载mongodb的安装包,这边安装的是3.2版本;2、选择地方创建文件夹MongoDB下面data、logs、etc,在etc中新建文件mongo.conf;3、进入安装目录,cd D:\ruanjian\MongoDB\Server\3.2\bin 再执行下面的命令:mongod --dbpath=c:\MongoDB\data --port=27017上面命令中的...

随便推点

汉诺塔的递归算法与解析_孤独与生俱来的博客-程序员秘密_汉诺塔递归算法及详解

从左到右 A B C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面.如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号.小时候玩过这个游戏, 基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊. 后来学习编程, 认识到递归, 用递归解决汉诺塔的算法也是我除了简单的排序算法后学习到的第一种算法.至于 递归,简单来说就是方法内

java在子线程与主线程传递数据(回调函数)_🐋的博客-程序员秘密_子线程如何将运行后的结果传回到主线程

本文为博主原创文章,未经博主允许不得转载。     https://blog.csdn.net/feipeng8848/article/details/54135883                                            java在子线程与主线程传递数据1.代码中用到的类介绍C:拥有两个方法分别是设置value和获得value,拥有一个私有变量valu...

LRU算法代码实现记录一下_IAmZRH的博客-程序员秘密_lru算法代码

前言之前有写过一篇关于LRU淘汰算法的文章 LRU算法记录一下,LRU算法思想是淘汰最近最少使用的元素,当一个元素在一段时间内没有访问过后,那么在之后的一段时间也极有可能不会被访问,然后当数据池满了后将其淘汰掉。这次把关于LFU算法的三种不同实现方式写一下,那废话不多说,show me codeLRU实现之数组 O(N)/** * LRU实现之数组 O(N) * * @Author: ZRH * @Date: 2021/8/13 10:32 */public class ArrayL

vs2019调试python简明教程_鲁峰2012的博客-程序员秘密_vs2019 调试python

最近purcham对注册码封的特别严重,经常出现用一端就被封注册码的情况,我一直在想作为世界上用的人数最多的ide之一visual studio是否也有调试python的功能,百度一搜发现果然支持,本文以vs2019为例,引导使用vs2019调试python3。vs2919的安装 vs2019 下载地址https://www.newasp.net/soft/435225.h...

数据结构练习题---先序遍历二叉树_无知的渣渣的博客-程序员秘密_先序遍历例题

描述给定一颗二叉树,要求输出二叉树的深度以及先序遍历二叉树得到的序列。本题假设二叉树的结点数不超过1000。输入输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二叉树。每棵二叉树的结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理。二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个......,如果某个结点不存在以0代替),比如输入: 1 2 0 3 4 -1得到的二叉树如下:

HTML+CSS 学习总结_常青ฅ ̳͒的博客-程序员秘密

HTML1、HTML超文本标记语言2、作用写网页结构内容3、文件后缀.html 或者 .htm4、HTML不区分大小写,建议小写5、html由浏览器解析执行,由上往下,由左往右6、标签 标记 元素HTML由标签组成标签是一对尖括号包含的关键词双标记 封闭类型标记h1-h6,div,span,p,b,i,u,s,del,sup,sub,em,strong,a,ul,ol,li,dl,dt,dd,form,button,textarea,table,tr,td,th,ca

推荐文章

热门文章

相关标签