当前位置: 首页 > 后端技术 > Python

Django入门教程(做个疫情数据报告)

时间:2023-03-26 14:12:24 Python

Django是一个Pythonweb框架,读作[?d???ɡo],中文翻译为“姜狗”。为什么要学习框架?其实我们可以用Python代码从0到1写一个网站,但是接下来我们需要写网络服务、数据库读写等底层代码。框架的作用就是搭建这些底层基础设施,我们只需要写业务逻辑即可。例如,建筑物是一个框架。我们不管底层的脚手架和钢筋混凝土是怎么搭的。只要我们有这样一个框架,我们就可以生活在其中。我们关心的是里面的房间如何设计和装修。1初识Django时,我使用的Python版本是3.8。首先执行如下语句先安装Django。pipinstallDjango安装完成后,执行以下语句创建一个Djangoproject\django-adminstartproject。这是杜马。命令执行后,会在当前目录下生成一个duma目录,其中包含以下源文件。duma/manage.pyduma/__init__.pysettings.pyurls.pyasgi.pywsgi.py简单介绍一下这几个文件的功能:settings.py后面会经常用到:Django项目的配置文件,比如:配置项目使用什么数据库,包含哪些应用等mysite/urls.py:Django项目mysite/asgi的URL声明.py:作为您的项目在符合ASGI标准的Web服务器上运行的入口点。暂时未使用的mysite/wsgi.py:作为在WSGI兼容的Web服务器上运行的项目的入口点。暂且在后面的学习中对以上文件进行使用和修改,到时候对它们的作用会有更深刻的认识。执行以下命令启动web服务,验证duma工程是否创建成功。pythonmanage.pyrunserver执行命令,会看到如下信息输出Startingdevelopmentserverathttp://127.0.0.1:8000/在浏览器中访问http://127.0.0.1:8000/可以看到如上页面,说明项目创建成功。接下来我们将在duma项目中创建一个应用程序(app)。一个项目可以有多个应用,比如一个电商项目可以有商城应用、支付应用、会员应用等等。执行此命令创建一个应用pythonmanage.pystartappncov这里创建一个名为ncov的应用,用于做疫情数据上报。在项目的根目录下会发现一个ncov目录,里面有如下文件ncov/__init__.pyadmin.pyapps.pymigrations/__init__.pymodels.pytests.pyviews.py它们的我就不介绍了firstfirst,这些文件以后用到基本都会覆盖,到时候再详细介绍。2Hello,World“Hello,World”是一个学习任何编程语言的演示程序,现在我们使用Django来实现一个“Hello,World”web应用程序。首先,在“nocv/views.py”文件中创建索引函数fromdjango.httpimportHttpResponsedefindex(request):returnHttpResponse('Hello,World!')然后,在ncov目录中创建urls.py文件,它用于定义ncov应用程序包含的url。例如:在电商商城应用中,会有商城首页的url和商品详情的url。在urls.py文件中添加一个url对应index函数。从django.urls导入路径。importviewsurlpatterns=[path('',views.index,name='index'),]第一个参数是url的路径,这里是一个空字符串,表示ncov应用的根路径;第二个参数是url对应的视图;第三个参数是url的名称,可以自定义。最后,在“duma/urls.py”中添加代码,将ncov应用的url注册到duma项目中。添加的代码如下fromdjango.contribimportadminfromdjango.urlsimportpath,includeurlpatterns=[path('admin/',admin.site.urls),path('ncov/',include('ncov.urls')),]在浏览器中访问ncov应用根路径http://127.0.0.1:8000/ncov/如果看到如上图的页面代表成功。如果启动的服务关闭了,需要在duma目录下执行pythonmanager.pyrunserver命令重启web服务。当访问ncov应用的根路径时,浏览器会产生一个http请求。duma项目的web服务收到请求后,会根据urls.py中的配置,调用“ncov/views.py”文件的index函数来处理这个请求,index函数使用HttpResponse构造string"Hello,World"作为http响应结果返回给浏览器。浏览器收到响应结果后,在页面上显示“Hello,World”字符串。如果细心的话,你会发现HttpResponse('Hello,World!')和print('Hello,World')非常相似,这是我们学习Python语言时的第一个demo程序。两者都输出“Hello,World”字符串,前者在浏览器输出,后者在控制台(命令行)输出。这就是框架的力量。我们只关注业务逻辑。HTTP底层如何请求,如何响应,如何返回给浏览器,都是框架帮我们完成的。3连接数据库一个电子商务网站会展示很多商品,这些商品的信息都存储在数据库中。同样,ncov应用程序也需要将流行病统计数据存储在数据库中。打开“duma/settings.py”文件,找到DATABASES配置,如下',}}以下是一些默认配置。“default.ENGINE”表示数据库引擎是sqlite3,是一个轻量级的数据库。您也可以将数据库引擎更改为MySQL、MongoDB等。“default.NAME”是数据库的名称。对于sqlite数据库,这里填写数据库的路径。BASE_DIR表示项目根目录。这时候查看项目根目录,可以发现有一个db.sqlite3文件,是Django创建的。后面我们就是用它来存储数据。不知道你会不会有这样的疑问。数据库如何成为一个文件?其实数据库的底层是文件,只是在文件之上建立了一套引擎,将文件的内容以表格的形式展示出来,并提供增删改查的功能。就好比程序员本质上也是人,只是因为从事编程才叫程序员。有了数据库,还需要在数据库中创建表。一般来说,表可以直接用数据库命令创建。但由于我们使用的是框架,我们可以使用Django来完成。在“ncov/models.py”文件中创建一个Django模型fromdjango.dbimportmodelsclassCyStat(models.Model):stat_dt=models.CharField(max_length=10)#datecy_name=models.CharField(max_length=50)#Countrynameconfirm=models.IntegerField()#累计诊断dead=models.IntegerField()#累计死亡heal=models.IntegerField()#累计治愈today_confirm=models.IntegerField()#现有诊断today_new_confirme=models(Int)#添加新的diagnosis这里定义了CyStat类来表示各个国家每天的疫情统计。包含7个属性,用模型中的类对象初始化。stat_dt和cy_name定义为models.CharField类型,代表字符类型。日期格式为2021-11-01,占10个字符,所以max_length=10;对于国名,一般不超过50个字符,所以它的max_length=50。其他几个字段是统计数据,直接使用整数即可。拥有数据模型只是第一步,我们如何获取数据呢?这时候就需要将模型与数据库中的表关联起来。首先在duma项目中注册ncov应用,在“duma/settings.py”文件中找到INSTALLED_APPS配置,将ncov应用添加到数组中。添加后INSTALLED_APPS数组如下','django.contrib.staticfiles','ncov.apps.NcovConfig'#registerncovapplication]接下来运行如下命令pythonmanage.pymakemigrationsncov,可以看到Migrationsfor'ncov'输出如下信息:ncov/migrations/0001_initial.py-CreatemodelCyStat这个命令会在“ncov/migration”目录下创建0001_initial.py文件,如果看源码可能看不出它的功能,我们可以执行下面的语句将其转换成sql,这很容易理解。pythonmanage.pysqlmigratencov0001执行后,输出BEGIN;----CreatemodelCyStat--CREATETABLE"ncov_cystat"("id"integerNOTNULLPRIMARYKEYAUTOINCREMENT,"stat_dt"varchar(10)NOTNULL,"cy_name"varchar(50)NOTNULL,"confirm"整数NOTNULL,"dead"整数NOTNULL,"heal"整数NOTNULL,"today_confirm"整数NOTNULL,"today_new_confirm"整数NOTNULL);犯罪;可以发现其实是建表sql,表名是应用名和模型类名的组合,用下划线连接。除自动添加的id外,其他字段名称和定义与模型类属性一致。最后执行如下命令完成建表操作pythonmanage.pymigrate我们可以打开db.sqlite3数据库查看是否成功。Mac电脑自带sqlite3命令直接打开,Windows电脑安装SQLiteAdministrator客户端即可。django_content_typeauth_permissiondjango_migrationsauth_userdjango_sessionauth_user_groupsncov_cystatauth_user_user_permissions可以发现名为ncov_cystat的表,它就是按照CyStat类创建的表。除此之外,还有很多其他的表,都是Django框架自带的,我们暂时先不管。这样我们就把modelCyStat类对应到数据库中的ncov_cystat表。后面需要查询或者修改数据,直接操作CyStat类,不用写sql。这里我们可以发现使用Django框架的另一个优势——模型类与数据库隔离(行话叫解耦)。好处是以后我们项目上线后如果想把sqlite数据库改成mysql,只需要修改settings.py文件中DATABASES的数据库引擎和数据库名,重新执行建表命令即可.表的定义和表的查询、更新逻辑完全不需要改变。4编写网页在上一节中,让我们编写网页来显示数据。有了上面的基础,我们知道应该在views.py文件中查询ncov_cystat表的数据,然后将数据返回给浏览器。首先,我们需要将一些数据导入到ncov_cystat表中。sqlite>插入ncov_cystat(stat_dt,cy_name,confirm,dead,heal,today_confirm,today_new_confirm)VALUES("2021-09-03","cn",123169,5685,115024,2460,33);sqlite>insertintoncov_cystat(stat_dt,cy_name,confirm,dead,heal,today_confirm,today_new_confirm)VALUES("2021-09-04","cn",123199,5685,115105,2409,30);...读取数据并返回到浏览设备。修改"ncov/views.py"文件中的index函数\fromdjango.shortcutsimportrenderfrom.modelsimportCyStatdefindex(request):cy_stats=CyStat.objects.filter(cy_name='cn').order_by('-stat_dt')[:7]context={'cy_stats':cy_stats}returnrender(request,'ncov/index.html',context)CyStat.objects会返回ncov_cystat表中的所有记录,filter用于过滤数据在按字段表中,'cn'代表中国,cy_name='cn'表示我们只保留国内数据,order_by用于将返回的结果按照某个字段(列)排序,在前加'-'字段名表示降序,这里我们只取最近7天的数据。现在我们不能像“Hello,World”那样直接返回,因为那样返回的是一个没有任何样式的字符串。我们返回的应该是一个HTML文件,所以我们需要调用reder函数,返回“ncov/index.html”。在ncov目录下创建“templates/ncov/index.html”文件,写入如下代码

国内疫情数据

日期现有诊断新诊断{%forstatincy_stats%}{{stat.stat_dt}}{{stat.today_confirm}}{{stat.today_new_confirm}}{%endfor%}这个文件使用表格来展示数据,你会发现这不是纯HTML文件。准确的说,index.html是Django定义的一种模板语言,支持按照一定的语法编写Python代码,比如for循环,stat对象的使用。render函数可以解析模板语言,生成纯HTML文件,返回给浏览器。在浏览器中访问http://127.0.0.1:8000/ncov/,可以看到如下页面,虽然可以显示数据,但是有点难看,前端风格需要优化。刚刚提到的HTML和Django模板语言都是标记语言,语法比较简单。没学过的朋友可以找一些教程补上。要显示更漂亮的图片,一般都是借助js来实现的。有js基础的朋友可以自己写前端页面。如果没有,可以使用pyecharts,它支持用Python代码制作图表。下载pyechartsGitHub项目源码(https://github.com/pyecharts/...),将“pyecharts/render/templates”目录下的源文件复制到“ncov/templates”目录下,继续修改索引函数如下,它返回一个折线图,而不是使用pyechartsAPI。fromdjango.httpimportHttpResponsefromdjango.shortcutsimportrenderfrompyecharts.chartsimportLine,Mapfrompyechartsimportoptionsasoptsfrom.modelsimportCyStatdefindex(request):cy_stat=CyStat.objects.filter('cy_name='-stat_dt')[:14]stat_list=[x.stat_dtforxincy_stat]stat_list.reverse()today_confirm_list=[x.today_confirmforxincy_stat]today_confirm_list.reverse()xtoday_new_confirm_listfor[x.today_new_stat]today_new_confirm_list.reverse()c=(Line().add_xaxis(stat_list).add_yaxis("现在有确诊",today_confirm_list).add_yaxis("新增确诊",today_new_confirm_list).set_global_opts(title_opts=opts.TitleOpts)return)EpidemicData(title="DomesticData")HttpResponse(c.render_embed())页面效果如下,效果还不错。学完这些,我们就已经启动了Django,留个功课,看看能不能做出下面的效果。所有代码(包括作业)回复“GettingStartedwithdjango”。今天介绍的只是Django的一小部分。如果大家有更好的反馈,后续会继续更新。您可以随时提问。以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能领取大量学习资料。或者去编程学习网了解更多编程技术知识。