Django入门
来源:互联网 发布:mac应用程序开发 编辑:程序博客网 时间:2024/04/29 15:41
前几天看了Python的一些基础知识,然后又了解了一下相关的web框架,比较主流的有Django和Flask,比较了一下之后决定学Django,基础供能比较完善,对于初学者应该更友好一些。一边跟着大神的博客做,一边整理了这篇博客,没什么新的东西,只是我个人的学习笔记,其中一些部分我专门修改成不太一样的东西,以免学习过程中不求甚解的忽略。总的来说大神这篇博客非常不错,如果你是刚学习了Python的基础语法,想要试着做点什么,那么就跟着下面的参考资料中,大神的博客过一遍吧,很有趣很简单,就能撸一个网站的demo了。
参考资料Leo_wlCnBlogs
源码下载
在此由衷感谢作者的分享。
安装PyCharm
直接搜索PyCharm下载安装Windows专业版,这里有专业版注册码。
创建project
安装完成之后会提示创建新的project,里边就能够直接选择创建Django项目,点击之后如果你没有Django会自动安装,这里要挂VPN。下载之后选择目录,就会自动创建目录了。直接运行,就能够看到第一个页面。
这时候还没有myapp文件夹和static文件夹,经过下边的步骤才有。
创建APP
完成上边的步骤之后,虽然能运行服务器了,但是还不能显示我们所需要的内容。接下来创建app。在pycharm下方的terminal终端中输入命令:python manage.py startapp myapp
这样就创建了一个叫做myapp的APP,django自动生成“myapp”文件夹。
然后把我们新定义的app加到settings.py中的INSTALL_APPS中。
编写路由
路由都在urls文件中,首先导入队形的app的views文件from myapp import views
然后在urlpatterns之中加上url映射url(r'^index/', view.index),
这样,用户在浏览器中输入的url就会映射到相应的业务处理逻辑上了。
编写业务处理逻辑
业务处理逻辑在views.py文件中。
from django.shortcuts import HttpResponsedef index(request): # request.POST # request.GET return HttpResponse('hello world!')
通过编写路由和业务处理逻辑,我们将index这个url指向了views里的index()函数,它接收用户请求,并返回一个hello world 字符串。
运行web服务
命令行运行方式:python manage.py runserver 127.0.0.1:8000
在pycharm中,可以直接按按绿色小三角的按键来运行。成功之后下方还会显示连接,点击即可打开相应的页面。
如果有错误,Django会在页面中详细显示错误内容。根据上边的步骤打开,会发现出现 404错误,这是因为我们指定的是index页面,只要在url后边加上index即可。
返回HTML文件
首先写一个index.html
然后修改一下views文件:
1.首先pycharm一般会自动帮你导入Django的render模块。没有的话要记得加上
2.然后把之前的index函数改为:
def index(request): # request.POST # request.GET #return HttpResponse('hello world!') #下边的参数request是固定的,第二个参数是指定的文件,即index.html return render(request,'index.html')
当你想返回一个html文件时,就要使用render方法来渲染(其实就是打包的意思)。render是Django提供的方法和规则,直接使用即可。
为了让Django知道我们的html文件在哪里,需要修改settings文件的相应内容。但是由于是Django给我们创建的工程目录,所以默认情况下它知道我们的html就放在template这个文件夹下边,我们无需修改。
频繁重启时,由于端口为释放的原因,可能会启动不了服务,修改下端口就OK了。
使用静态文件
现在我们已经能够返回html了,但是肯定不能少了css和js,这样前端才算完整。在Django中,一般将静态文件放在static目录中,这里就自己来创建一个static目录。然后在目录下放置css和js。
为了让Django找到这个目录,依然需要对settings进行配置。尤其这个static目录是我们自己创建的Django还不知道它是干嘛的。打开之后挥发新啊在settings文件的底部,Django已经为我们预留了位置,直接设置即可。
按照上图进行设置之后,就可以在html中引入js和css了。
重启刷新即可看到结果。
接受用户发送的数据
接下来就要让web服务器和用户之间进行交互了。我们在html中设计一个表单,让用户输入信息,再提交给index这个url,服务器将收到这些数据:
1.修改html,加个表单:
<h1>input your massage:</h1><form action="/index/" method="post"> <input type="text" name="name" placeholder="input your name"> <input type="text" name="age" placeholder="input your age"> <input type="submit" value="submit"></form>
2.修改views.py文件,业务逻辑index函数:
def index(request): if request.method == 'POST': name = request.POST.get('name',None) age = request.POST.get('age',None) print(name,age) return render(request,'index.html',)
3.此事直接使用会出错,因为Django有一个跨站请求保护的安全机制,我们在settings文件中把下列语句注释掉:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', #'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',]
接下来就能正常工作了,在浏览器中输入提交之后,我们能在pycharm中看到相应的数据。
返回动态页面
上一节我们能收到用户数据了,但是返回给用户的还是静态页面。一般来说,我们收到数据之后会在后台进行处理,之后再返回给用户。
这时候Django采用jinja2语言编写动态模板,jinja2会根据提供的数据,替换掉html中的相应部分。
模板引擎:模板引擎分为前端模板引擎和后端模板引擎,其区别在于是否在浏览器上渲染模板、填充数据。vue,react,angularjs等mvvm框架也自带模板输出模块,他们也属于前端模板引擎。
另外,除了mvvm前端框架自带的模板输出模块在浏览器跑之外,其他前端js模板引擎大多数都是基于nodejs服务器运行的,所以,js模板引擎!= 前端模板引擎(部分模板引擎可以在浏览器跑)。
进一步了解可以看看这篇博客
jinjia2语言来写模板的语法可以在这里学习
详细语法入门后再深入学习。
接下来,改造views.py文件:
user_list = [ {'user':'Jack','age':'16'}, {'user':'Tom','age':'20'}, {'user':'Alex','age':'26'}]def index(request): if request.method == 'POST': name = request.POST.get('name',None) age = request.POST.get('age',None) temp = {'name':name,'age':age} user_list.append(temp) return render(request,'index.html',{'data':user_list})
然后改造index.html文件,插入jinjia2模板语法:
<h1>user list</h1><table> <tr> <th>name</th> <th>age</th> </tr> // jinjia2模板语法的循环和插值 {% for line in data %} <tr> <td>{{ line.name }}</td> <td>{{ line.age }}</td> </tr> {% endfor %} </table>
使用数据库
上边已经实现了跟用户的输入输出,就剩在数据库里边保存数据了。Django通过自带的ORM框架操作数据库,并且自带轻量级的SQLite数据库。接下来操作试试:
1.在settings文件中注册app:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', #在这里加入你创建的app文件夹名 'myapp']
不注册它,你的数据库就不知道给哪个app创建表。
2.在settings中,配置数据库相关的参数,如果使用自带的SQLite,则不需要修改:
DATABASES = { 'default': { # 在这里指定使用的数据库类型,这里指定了Django自带的轻量数据库SQLite3,初学直接用它就好了,这里就不改了。 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}
3.编辑models.py文件,也就是MTV中的M:
# 这边要继承这个models.Model类,固定写法class UserInfo(models.Model): #创建2个字段,最大长度32,类型是char name = models.CharField(max_length=32) age = models.CharField(max_length=32)
我们创建了两个字段分别保存名字和年龄。
4.在pycharm的teminal中通过命令创建数据库的表。这里需要2条命令:
python manage.py makemigrations
输入之后会在app中的migrations文件夹中创建一个新文件。、
再输入:
python manage.py migrate
来同步数据库,之后会出来一大堆OK。
5.修改views.py中的业务逻辑:
def index(request): if request.method == 'POST': name = request.POST.get('name',None) age = request.POST.get('age',None) # 添加数据到数据库 models.UserInfo.objects.create(name=name,age=age) # 从数据库中读取所有数据 user_list = models.UserInfo.objects.all() return render(request,'index.html',{'data':user_list})
重启web服务器,刷新页面之后,就能跟用户进行数据交互了,在上边书写提交,然后在下边显示出来。
至此一个简单的Django项目就完成了。
Django总结
跟着大神的思路走了一遍之后,发现Django确实是一个非常棒的框架,功能强大,常用的东西都帮你集成好了,作为初学者,没有什么大坑,一步步认真跟过来就能完成了。最后,大神的建议我深以为然:学习新东西的时候,不要一开始就扎入细节,先对整理有个认识,了解知识框架,再学习基本内容,最后再深入。之前看了Python的语法,看了挺久的,也写不出什么东西,今天跟着这个博客走了一遍, 一个简单的demo就出来了。接下来我只要在它的基础上修修补补,增加功能,就能完成简单的网站了,在过程中,遇到哪里不懂的,再去搜索学习,解决问题,我觉得这样的学习方式效果好,而且不枯燥,很有成就感。
- django 入门-安装Django
- Django入门
- Django入门
- django 入门
- Django入门
- Django入门
- Django入门
- Django入门
- Django入门
- django入门
- Django入门
- django入门
- Django入门
- Django入门
- Django入门
- Django入门
- Django入门:Django urls配置
- Django入门:Django执行流程
- react native textInput随内容高度设置textinput高度
- KSDK2.0 Keil MDK 生成bin文件方法
- git错误“git did not exit cleanly (exit code 128)”的解决办法
- Minimum Moves to Equal Array Elements II
- Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core"
- Django入门
- Codeforces Round #380 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 2)
- Java求多项式exp(x)=1+x+ 2!/ x2 + 3!/x3 +……+ i!/xi (|i!/xi|≤10^-10)
- 国内外主流android第三方服务
- DataTable数据检索的性能分析
- IO流(2)
- 移动web适配利器-rem
- java web中读取properties文件时的路径问题
- Android-托管UI fragment