jinja2模块模板语法 django基础

jinja2去数据库中获取数据,传递给HTML页面 ,借助于模板语法 发送给浏览器 还能帮你简单方便的操作字典

去后端获取数据库中数据展示到前端页面

复制代码
import pymysql

def get_user(env):去数据库中获取数据,传递给HTML页面 ,借助于模板语法 发送给浏览器 还能帮你简单方便的操作字典

  conn=pymysql.connect(

    host='127.0.0.1',

    post=3306,

    user='root',

    password='admin123',

    bd='day59',表名

    charset='utf8',

    autocommit=Turn

)

  cursor=conn.cursor(cursor=pymysql.cursors.cursors.DictCursor)拿到的是字典

  sql='select * frome userinfo'

  affect_rows=cursor.execute(sql) 返回值是这个操作所影响的函数

  data_list=cursor.fetchall() #[{},{},{}]

#接下来应该将获取到的数据传给HTML文件 所以要创建文件

  with open(r'templates/05get_data.html','r',encoding='utf-8')

    tmp=Template(data)

  res=tmp.render(user_list=data_list) 这部分是将列表套字典都传给了HTML文件

#给get_dict.html传递了一个值 页面上通过变量名user就能拿到user_dict

  return res

 

if __name__=='__main__':

  get_user(111)
View Code
复制代码

 

 

 

05get_data.html

复制代码
<body>

<div class="container">

  <div class="row">

    <div class="col-md-8 col-md-offset-2">

      <h1 class="text-center">用户数据</h1>   效果居中

      <table class="table table-hovar table-striped">

        <thead>

          <tr>

             <th>ID</th>

               <th>username</th>

            <th>password</th>

            <th>hobby</th>

          </tr>

        </thead>

        <tbody>

          {% for user_dict in user_list %}  for循环 也是模板语法

            <tr>

              <td>{{user_dict.id}}</td>

              <td>{{user_dict.username}}</td>

              <td>{{user_dict.password}}</td>

              <td>{{user_dict.hobby}}</td>

            </tr>

          {% endfor%}

        </tbody>

      </table>

    </div>

  </div>

</div>

<div></div>

</body>  即可再浏览器查看表格并且是实时网页 删除数据库一项数据刷新后网页同步

 
View Code
复制代码

 

 手写

1.socket代码需要我们自己写
2.http格式的数据自己处理(只能拿到用户辅入的路由)
·基于wsgire/模块
1.帮助你封装了socket代码
2.帮你处理http格式的数据(大字典)
wbe服务网关接口
1.请求来的时候帮助你自动拆分http格式数据并封装成非常方便处理的数据格式
2.响应走的时候帮你将数据再打包成符合http格式
根据功能的不同拆分成不同py文件(关键)
urls.py
路由与视图函数对应关系
views.py 业务逻辑的视图函数
templates模版文件夹
存储html文件
拆分完成后 后续想要添加功能 只需要在 urls.py中和views.py中书写对应的代码即可

 

例子二:views.py:

复制代码
import datetime

def get_time(env):

  current_time=datetime.datetime.now().strftime('%Y-%m-%d-%X')

  #如何将后端获取到的睡传递给HTML文件?

  with open(r'templates/03 mytime.html','r',encodeing='utf-8')as f:

    data=f.read()

  #data就是一堆字符串

  data=data.replace('hkwfnknfk',current_time) #再后端将HTML页面处理好之后再返回给前端

  return data
复制代码

 

 

 

复制代码
from  jinja2 import Template 

def get_dict(wnv):

  user_dic={'username':'zhu':'age':18','hobby':study}

  with open(r'teplates/04 get_dict.html','r',encoding='utf-8')as f:

    data=f.read()

  tmp=Template(data)

  res=tmp.render(user=user_dic)

#给get_dict.html传递了一个值 页面上通过变量名user就能拿到user_dict

  return res

 
复制代码

 

 

 

 

 

 

 

 

 

路由与视图函数

复制代码
from views import *

urls=[('/index',index),

  ('/login',login),

  ('/xxx',xxx),

  ('/get_time',get_time),

  ('/get_dict',get_dict)

]

 
复制代码

 

 

 

 

04 get_dict.html:

复制代码
<body>

<h1>我是一个页面</h1>

{{user}}取整个字典  模板语法 非常贴近Python语法 是再后端起作用的

{{user.get('username')}}字典取单个值的三种方式

{{user.age}}

{{user['hobby']}}

</body>
复制代码

 

 

简易版本web框架流程图

 

wsgiret模块

1.请求来的时候解析HTTP格式的数据  封装成大字典

2.响应走的时候给数据达成成符合HTTP格式 再返回给浏览器

 

Python三大主流框架

1.django  特点:大而全 自带的功能特别特别特别多 类似于航空母舰 不足:有时候过于笨重

2.flask 特点:小而精 自带的功能特别少 类似于游骑兵 第三方的模块特别多 如果将flask第三方的模块加起来完全可以盖过django 并且也越来越像django 不足:比较依赖于第三方

3.tornado 特点:异步非阻塞 支持高并发 牛逼到甚至可以开发游戏服务器

 

 

A.socket部分

B.路由与视图函数对应关系(路由匹配)

C.模板语法

 

django:A用的是别人的 wsgiref模块 B用的是自己的 C用的是自己的(没有jinja2好用 但是也很方便)

flask  A用的是别人的 Werkzeug(内部还是wsgiref模块 B自己写的  C用的别人的(jinja2)

tornado  ABC全都是自己写的 异步这些全都是自己写的

 

注意事项

#如何让你的计算机能够正常启动django项目?

1.计算机的名称不能有中文

2.一个Python窗口只开一个项目

3.项目里面所有的文件也尽量不要出现中文

4.Python解释器尽量使用3.4-3.6之间的版本

(如果满足以上条件你的项目报错 你点击最后一个报错信息 去源码中把逗号删掉即可)

 

#django版本问题

 

1..x  2.x     3.x(直接忽略)

1.x 和2.x本身差距也不大  我们讲解主要以1.x为例 会讲解2.x区别 公司之前用的1.8 慢慢过渡到了1.11版本 有一些项目用的2.0

#django安装

pip3 install django==1.11.11  在Python中 设置里找jango 不要直接安装 需要选择1.11.11版本再安装

如果已经安装了其他版本 无需自己卸载 直接重新装会自动卸载安装新的

验证是否成功的方式一:终端输入django-damin看看有没有反应

 

django基本操作

一、#命令行操作

1.创建django项目

你可以先切换到对应的盘如何再创建

django-admin startproject mysite(项目名)  #创建好之后应该是在c盘下

例如:django-admin startproject mydjangoproject

 

 

创建好以后搜索django出来是这样的:

复制代码
  mysite文件夹

  manage.py

       mysite文件夹

    __init__.py

    settings.py

    urls.py

    wsgi.py
复制代码

 

2.启动django项目

创建好之后一定要先切到项目目录下:cd/mysite

通过manage.py启动再terminal中敲

命令行启动①

python3 manage.py runserver  http://127.0.0.1:8000    #django端口号是8000

 

或者

python3 manage.py runserver 8080默认是监听本机127.0.0.1

 

(别人访问不到的方式),以后再项目上线时用0.0.0.0的比较多   ctrl+c是停止

pycharm启动② 右上角 点开写项目名 监听端口号  监听地址 ✓上中间第一个

 

 

 

django中默认情况下socket用的是wsgiref(自己写的web框架)

 

 

 Ctrl+c停掉

3.创建应用app

Python3 manage.py startapp  app01#APP的名字,需要见名知意

 

应用:django是一款专门用来开发APP的web框架,不是手机的那种APP,django框架类似于是一所大学,APP就类似于大学里面的各个学院,一个APP就是一个独立的功能模块

停掉:shift+c

4.创建的应用一定要去配置文件中注册   创建出来的应用第一步先去配置文件中注册 其他的先不要做 在settings.py  配置文件中 找到INSTALLED_APPS=.....中增加'app01.apps.App01Config'(全写)或者'app02'(简写)

ps:你在用pycharm创建项目的时候  pycharm可以帮你创建一个APP并且自动注册

 

 

 

 

主要文件介绍

复制代码
--mysite 项目文件夹

--mysite 文件夹

  --settings.py  配置文件

 

  --tests.py测试相关 不用管

  --wsgi.py wsgiref模块(不考虑)

--manage.py  django的入口文件

--db.sqlite3  django 自带的sqlite3数据库(小型数据库 功能不是很多还有bug)

-day 60 项目名

--app01  文件夹app的名字

  --admin.py django后台管理

  --apps.py  注册使用

  --migrations  文件夹 数据库迁移记录

--wsgi.py   wsgi服务器的配置,以后上线了才改

  --models.py   数据库相关的 模型类(orm)

 --urls.py  路由与视图函数对应关系(路由层)

  --views.py视图函数 重点

  --templates  模板文件

  --manage.py  启动项目创建app 各种命令的操作都跟他有关
复制代码

 

 

 

二、#pycharm操作

pycharm操作

 

  前提安装django

pip install django

 

1.new project 选择左侧第二个django即可(在安装django后之后 且关闭了其他django)

  2.启动

    ①还是用命令行启动

    ②点击绿色小箭头即可

  3.创建应用

    ①pycharm提供的终端直接输入完整命令:

Python3 manage.py startapp  app01(APP的名字,需要见名知意)

 

             

 

    ②pycharm tools run manage.py task提示(输入startapp app01  前期不建议使用)

               

 

 

  4.改端口号:点击Edi Canli...... 修改为8008 点击Appty ok

     创建server    edit confl......

 

 

 

 如果没有上图显示灰色,可以

 

 

 

 

命令行创建的app要再配置文件中注册

 

 pycharm点点点创建时候直接写上即可(只能写一个,多了还是要自己添加到配置文件中)

 

命令行与pycharm创建的区别

1.命令行创建不会自动有templatew文件 需要你自己手动创建而pycharm会自动帮你创建并且还会自动在配置文件中配置对应的路径

#pycharm创建

TCMPLATES=[

  {

    'BACKEND':'django.template.backends.django.DjangoTemplates',

    'DIRS':[os.path.join(BASE_DIR,'templates')]

}

#命令行创建

  TCEMPLATES=[

  {

    'BACKEND':'django.template.backends.django.DjangoTemplates',

    'DIRS':[],

]

对比之下 命令行创建少了一部分  也就意思为你在用命令行创建django项目的时候不单单需要创建templates文件夹还需要去配置文件中配置路径:

'DIRS':[os.path.join(BASE_DIR,'templates')]

搜索配置文件与更详细的分析

 


 

 

 

django小白必会三板斧

导入:

from django.shortcuts import HttpResponse,render,redirect

 

  HttpResponse 返回字符串类型的数据

  例如:

    

def index(request):

      #param request:请求相关的所有数据对象  比你之前的env更加牛

      #return:

      return HttpResponse("你好啊  我是django")

 

  render 返回html文件的

      return render(request,'myfirst.html') #自动去tempaltes文件夹下帮你查找文件 前        提是有添加到配置文件中

    例如:

    

复制代码
def index(request):

      username_dict={'username':'zhu','age':18}#视图函数必须要要接受一个形参request

      #第一种传值方式

      return render(request,'传值的目的文件01 ab-render.html',{'data':user_dict,'data':123})

就是将user_dict传给ab_render页面 页面上通过data就能拿到字典数据

      #第二种方式:当你要传的数据特别多的时候

    def index(request):

      username_dict={'username':'zhu','age':18}

      return render(request,'01 ab_render.html',locals())

      Locals会将所在的名称空间中所有的名字全部传递给HTML页面
复制代码

 

redirect 重定向 

return redirect('http://www.baidu.com/')  其他url需要写全

retunrn redirect('/home/')自己的不用写ip和端口

 

会将所在的名称空间找那个所有的名字传递给html页面

 

配置文件讲解:

 

 

 路由简单入门:

1.地址和视图函数的映射关系---urls.py文件

urlpatterns列表

 2.现阶段使用

 复制一行 改一下第一个参数(正则表达式),第二个参数是视图函数内存地址(需要导入相对应的文件信息例如:from app01 import views)

 

JsonResponse对象

复制代码
"""
json格式的数据有什么用?
    前后端数据交互需要使用到json作为过渡 实现跨语言传输数据

前端序列化
    JSON.stringify()                    json.dumps()
    JSON.parse()                            json.loads()
"""
import json
from django.http import JsonResponse
def ab_json(request):
    user_dict = {'username':'qq好帅哦,我好喜欢!','password':'123','hobby':'girl'}

    l = [111,222,333,444,555]
    # 先转成json格式字符串
    # json_str = json.dumps(user_dict,ensure_ascii=False)#不进行转码 前端显示还是中文
    # 将该字符串返回
    # return HttpResponse(json_str)
    # 读源码掌握用法
    # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})使用JsonResponse时写这个可以不进行转码 显示还是中文
    # In order to allow non-dict objects to be serialized set the safe parameter to False. 报错信息 需要加safe=False
    # return JsonResponse(l,safe=False)  
    # 默认只能序列化字典 序列化其他需要加safe参数    
复制代码

 

posted @   朱饱饱  阅读(1580)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示