Django新手项目实例_djongo新手案例-程序员宅基地

技术标签: 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

智能推荐

个人编码修养养成篇---花样缩进必学篇_c语言printf缩进-程序员宅基地

文章浏览阅读310次。低级程序员选择不缩进的理由:1.全部精力集中于项目本身,对缩进并不关注2.改写代码并将原始代码文件移植到其他系统平台的过程中,缩进不知不觉地消失了_c语言printf缩进

Redis缓存对象的实现原理-程序员宅基地

文章浏览阅读2.2k次。&nbsp; &nbsp; &nbsp; 截止到目前为止,在redis官方的文档和实现里面并没有针对object 对象缓存的方法,然而,在我们的实际开发需要中,在很多时候我们是需要进行对象缓存的,并且可以正确的读取出来! 在笔者正在开发的红包项目中,针对每天红包就需要使用的对象缓存,并可以随时修改缓存对象中的..._redis缓存对象的实现原理

oracle update太慢优化_oracle update 非常慢-程序员宅基地

文章浏览阅读1.3w次。tb_e_zw_nrllb_temp 量700225gsm_user 量109398337--优化前 两种update--说明:gsm_user是视图存在GSM_USER_ID索引,tb_e_zw_nrllb_temp有user_id索引,使用以下两种方法都更新时间超5h+导致不能更新成功--1 update tb_e_zw_nrllb_temp t set t.msisdn..._oracle update 非常慢

分布式一致性算法Raft论文(2)——复制状态机_状态机复制能处理什么问题-程序员宅基地

文章浏览阅读604次。2 Replicated state machines集群中某些服务器不可用,整个集群还可以工作。算法保证安全性;复制日志保持顺序性;Consensus algorithms typically arise in the context of replicated state machines [37]. In this approach, state machines on a collection of servers compute identical copies..._状态机复制能处理什么问题

HTTP请求与跨域_http连接 跨网 30分钟-程序员宅基地

文章浏览阅读4.8k次。浏览器发出一个请求到收到响应经历了哪些步骤1、浏览器解析用户输入的URL,生成一个HTTP格式的请求;2、先根据URL域名从本地hosts文件查找是否有映射IP,如果没有就将域名发送给电脑配置的DNS进行域名解析,得到IP地址;3、浏览器通过操作系统将请求通过四层网络协议发送出去;4、途中可能会经过各种路由器、交换机,最终到达服务器;5、服务器接收到请求后,根据请求所指定的端口,将请求传递给绑定了该端口的应用程序,如tomcat;6、tomcat接收请求数据后,按照http协议的格式_http连接 跨网 30分钟

异或差分,前缀异或的概念-程序员宅基地

文章浏览阅读1.9k次,点赞3次,收藏12次。最近在做cometoj看题解的时候发现了异或差分这一性质。随性就在本校oj上出了个题,题是离线的,可以O(n)过,如果改成在线的可以用树状数组在O(n*logn) 。问题链接:http://acm.nyist.cf/problem/1605问题描述与差分相似,我们构建一个异或差分数组B,那么B[i]=A[i]^A[i-1].,B[1]=A[1]。这样A[i]就可以B[i]的前缀异或..._异或差分

随便推点

苹果8p录像鸿蒙,录屏怎么录苹果8p | 手游网游页游攻略大全-程序员宅基地

文章浏览阅读252次。发布时间:2016-01-05我的世界手机版很多玩家喜欢制作游戏视频,用来分享给玩家或者为其他玩家录制一些游戏教程.我的世界手机版怎么拍视频呢?99安卓网小编下面就来介绍我的世界手机版录制视频的教程,供参考. 我的世界手机版拍视频教程: 方法一: 首 ...标签:我的世界手机版发布时间:2017-10-20王者荣耀的自由录屏功能极大的方便了玩家,不过很多玩家对于这个功能还不会使用.下面就为大家介绍..._鸿蒙怎么录屏

浅析MVC_mvc前端框架有哪些-程序员宅基地

文章浏览阅读119次。背景MVC是一种架构设计模式,它通过关注点分离鼓励改进应用程序组织。在过去,MVC被大量用于构建桌面和服务器端应用程序,如今Web应用程序的开发已经越来越向传统应用软件开发靠拢,Web和应用之间的界限也进一步模糊。传统编程语言中的设计模式也在慢慢地融入Web前端开发。由于前端开发的环境特性,在经典MVC模式上也引申出了诸多MV模式,被实现到各个Javascript框架中都有多少的衍变。MVC含义MVC包括三类对象,将他们分离以提高灵活性和复用性。模型model用于封装与应用程序的业务逻辑相关的数_mvc前端框架有哪些

(IMDN ACMM2019)轻量化Lightweight Image Super-Resolution with Information Multi-distillation Network-程序员宅基地

文章浏览阅读6.7k次,点赞7次,收藏36次。文章地址:https://arxiv.org/pdf/1909.11856.pdf作者的项目地址:代码论文作者:Zheng Hui 西安电子科技大学一、简单介绍受IDN(CVPR2018)的的启发,文章提出了Multi-distillation模块,实现了内存和实时性之间的最优。整个文章的主要的贡献有:1、提出了轻量化的Multi-distillation网络,来快速和准确的做..._lightweight image super-resolution with information multi-distillation netwo

让windows日志记录web程序的异常-EnterpriseLibrary.ExceptionHandling在asp.net mvc中的初步应用...-程序员宅基地

文章浏览阅读90次。实现的功能很简单,就是用企业库的异常处理模块和日志模块,利用windows的系统日志,记录web应用的异常。我的企业库是4.1版1.添加对Microsoft.Practices.EnterpriseLibrary.ExceptionHandling和Microsoft.Practices.EnterpriseLibrary.Logging的引用2.重写Application_Error..._mvc网站可以与windows日志进行交互吗?

RegularExpressionValidator控件与常用验证正则表达式大全小结-程序员宅基地

文章浏览阅读1k次。分类: .NET控件研究 ASP.NET网站开发 ASP.NET报表 Asp.Net 2.0网站开发 ASP.NET AJAX ..._regularexpressionvalidator控件可以加入的正确表达式

Eclipse Console不断自动弹出的解决方法_console配置时弹出信息-程序员宅基地

文章浏览阅读3.8k次。最近链接手机调试程序的时候DDMS中的Console控制台总是反复的自动弹出。而我主要是使用LogCat来查看异常信息,Console自动弹出特别影响工作。现将关闭方法拿来与大家共享。Eclipse中按照如下顺序找到设置菜单的位置:Window — Preferences — Run/Debug — Console找到以下两项:Show when program w_console配置时弹出信息

推荐文章

热门文章

相关标签