首页 > 编程语言 >Python全栈工程师(40:Web框架Django基础)

Python全栈工程师(40:Web框架Django基础)

时间:2023-08-14 12:35:34浏览次数:45  
标签:Web Python py 40 django models url import admin


Python的WEB框架有Django、Tornado、Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。

基础入门教程:

http://www.runoob.com/django/django-tutorial.html

Python全栈工程师(40:Web框架Django基础)_python

安装:

环境搭建与pycharm的配置django安装及MySQL数据库配置

基本配置

一、创建django程序

  • 终端命令:django-admin startproject sitename
  • IDE创建Django程序时,本质上都是自动执行上述命令

cd sitename

创建app :
     python manage.py startapp appname

二、程序目录

Python全栈工程师(40:Web框架Django基础)_python_02

mysite:对整个程序进行配置;


  • setting.py:配置文件;
  • url.py:url对应关系;
  • wsgi.py:遵循WSIG规则,uwsgi+nginx

manage.py :管理Django程序

其他常用命令:

运行Django功能:

     python manage.py runserver 0.0.0.0
   
自动生成数据库:
python manage.py syncdb
python manage.py makemigrations  #数据修改表结构
python manage.py migrate
python manage.py createsuperuser

补充:pycharm里面--python exe manage.py  xx

appname:

    migrations  数据修改表结构

    admin.py   Django为我们提供的后台管理

    apps.py  配置当前app

    models.py  ORM,写指定的类,通过命令可以创建数据库表(orm)

    tests.py  单元测试

    views.py  写业务逻辑代码【主要要写的部分】

三、配置文件

1、数据库

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}


import pymysql
pymysql.install_as_MySQLdb()
# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
# 如下设置放置的与project同名的配置的 __init__.py文件中



2、模版路径


TEMPLATE_DIRS = (
        os.path.join(BASE_DIR,'templates'),
    )




3、静态文件

project.settings.py

STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'),
    )

路由系统

1、单一路由对应


1           

             url(r             '^index$'             , views.index),


2、基于正则的路由


        

             url(r             '^index/(\d*)'             , views.index),            


             url(r             '^manage/(?P<name>\w*)/(?P<id>\d*)'             , views.manage),


3、添加额外的参数


 

             url(r             '^manage/(?P<name>\w*)'             , views.manage,{             'id'             :             333             }),


4、为路由映射设置名称




             url(r             '^home'             , views.home, name             =             'h1'             ),            


             url(r             '^index/(\d*)'             , views.index, name             =             'h2'             ),

设置名称之后,可以在不同的地方调用,如:

  • 模板中使用生成URL     {% url 'h2' 2012 %}
  • 函数中使用生成URL     reverse('h2', args=(2012,))      路径:django.urls.reverse
  • Model中使用获取URL  自定义get_absolute_url() 方法


class NewType(models.Model):
    caption = models.CharField(max_length=16)


    def get_absolute_url(self):
        """
        为每个对象生成一个URL
        应用:在对象列表中生成查看详细的URL,使用此方法即可!!!
        :return:
        """
        # return '/%s/%s' % (self._meta.db_table, self.id)
        # 或
        from django.urls import reverse
        return reverse('NewType.Detail', kwargs={'nid': self.id})

获取请求匹配成功的URL信息:request.resolver_match

5、根据app对路由规则进行分类


1           

             url(r             '^web/'             ,include(             'web.urls'             )),


6、命名空间

a. project.urls.py


       

             from              django.conf.urls              import              url,include            


                          


             urlpatterns              =              [            


                          url(r             '^a/'             , include(             'app01.urls'             , namespace             =             'author-polls'             )),            


                          url(r             '^b/'             , include(             'app01.urls'             , namespace             =             'publisher-polls'             )),            


             ]


b. app01.urls.py


    

             from              django.conf.urls              import              url            


             from              app01              import              views            


                          


             app_name              =              'app01'            


             urlpatterns              =              [            


                          url(r             '^(?P<pk>\d+)/$'             , views.detail, name             =             'detail'             )            


             ]

c. app01.views.py



        

             def              detail(request, pk):            


                          print             (request.resolver_match)            


                          return              HttpResponse(pk)


以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

  • v = reverse('app01:detail', kwargs={'pk':11})
  • {% url 'app01:detail' pk=12 pp=99 %}

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

通过反射机制,为django开发一套动态的路由系统Demo: 点击下载

模板

1、模版的执行

模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。




def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)




from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Adrian'})
print t.render(c)



import datetime
from django import template
import DjangoDemo.settings
 
now = datetime.datetime.now()
fp = open(settings.BASE_DIR+'/templates/Home/Index.html')
t = template.Template(fp.read())
fp.close()
html = t.render(template.Context({'current_date': now}))
return HttpResponse(html



from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime
 
def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)





return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))



2、模版语言

 模板中也有自己的语言,该语言可以实现数据展示

  • {{ item }}
  • {% for item in item_list %}  <a>{{ item }}</a>  {% endfor %}
      forloop.counter
      forloop.first
      forloop.last 
  • {% if ordered_warranty %}  {% else %} {% endif %}
  • 母板:{% block title %}{% endblock %}
    子板:{% extends "base.html" %}
       {% block title %}{% endblock %}
  • 帮助方法:
    {{ item.event_start|date:"Y-m-d H:i:s"}}
    {{ bio|truncatewords:"30" }}
    {{ my_list|first|upper }}
    {{ name|lower }}

3、自定义simple_tag

a、在app中创建templatetags模块

b、创建任意 .py 文件,如:xx.py

#!/usr/bin/env python            


             #coding:utf-8            


             from              django              import              template            


             from              django.utils.safestring              import              mark_safe            


                          


             register              =              template.Library()            


                          


             @register             .simple_tag            


             def              my_simple_time(v1,v2,v3):            


                          return               v1              +              v2              +              v3            


                          


             @register             .simple_tag            


             def              my_input(             id             ,arg):            


                          result              =              "<input type='text' id='%s' class='%s' />"              %             (             id             ,arg,)            


                          return              mark_safe(result)



c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名


{             %              load xx              %             }


d、使用simple_tag

{             %              my_simple_time              1              2              3             %             }            


             {             %              my_input              'id_username'              'hide'             %             }



e、在settings中配置当前app,不然django无法找到自定义的simple_tag  


INSTALLED_APPS              =              (            


                          'django.contrib.admin'             ,            


                          'django.contrib.auth'             ,            


                          'django.contrib.contenttypes'             ,            


                          'django.contrib.sessions'             ,            


                          'django.contrib.messages'             ,            


                          'django.contrib.staticfiles'             ,            


                          'app01'             ,            


             )



更多见文档:https://docs.djangoproject.com/en/1.10/ref/templates/language/

中间件

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图。

Python全栈工程师(40:Web框架Django基础)_python_03

与mange.py在同一目录下的文件夹 wupeiqi/middleware下的auth.py文件中的Authentication类

中间件中可以定义四个方法,分别是:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。

Python全栈工程师(40:Web框架Django基础)_html_04

自定义中间件

1、创建中间件类

class              RequestExeute(             object             ):            


                          


                          def              process_request(             self             ,request):            


                          pass            


                          def              process_view(             self             , request, callback, callback_args, callback_kwargs):            


                          i              =             1            


                          pass            


                          def              process_exception(             self             , request, exception):            


                          pass            


                          


                          def              process_response(             self             , request, response):            


                          return              response



2、注册中间件

MIDDLEWARE_CLASSES              =              (            


                          'django.contrib.sessions.middleware.SessionMiddleware'             ,            


                          'django.middleware.common.CommonMiddleware'             ,            


                          'django.middleware.csrf.CsrfViewMiddleware'             ,            


                          'django.contrib.auth.middleware.AuthenticationMiddleware'             ,            


                          'django.contrib.auth.middleware.SessionAuthenticationMiddleware'             ,            


                          'django.contrib.messages.middleware.MessageMiddleware'             ,            


                          'django.middleware.clickjacking.XFrameOptionsMiddleware'             ,            


                          'wupeiqi.middleware.auth.RequestExeute'             ,            


             )





admin

django amdin是django提供的一个后台管理页面,改管理页面提供完善的html和css,使得你在通过Model创建完数据库表之后,就可以对数据进行增删改查,而使用django admin 则需要以下步骤:

  • 创建后台管理员
  • 配置url
  • 注册和配置django admin后台管理页面

1、创建后台管理员

python manage.py createsuperuser



2、配置后台管理url

url(r             '^admin/'             , include(admin.site.urls))



3、注册和配置django admin 后台管理页面

a、在admin中执行如下配置

from              django.contrib              import              admin            


                          


             from              app01              import               models            


                          


             admin.site.register(models.UserType)            


             admin.site.register(models.UserInfo)            


             admin.site.register(models.UserGroup)            


             admin.site.register(models.Asset)



b、设置数据表名称

class              UserType(models.Model):            


                          name              =              models.CharField(max_length             =             50             )            


                          


                          class              Meta:            


                          verbose_name              =              '用户类型'            


                          verbose_name_plural              =              '用户类型'



c、打开表之后,设定默认显示,需要在model中作如下配置

class              UserType(models.Model):            


                          name              =              models.CharField(max_length             =             50             )            


                          


                          def              __unicode__(             self             ):            


                          return              self             .name


from              django.contrib              import              admin            


                          


             from              app01              import               models            


                          


             class              UserInfoAdmin(admin.ModelAdmin):            


                          list_display              =              (             'username'             ,              'password'             ,              'email'             )            


                          


                          


             admin.site.register(models.UserType)            


             admin.site.register(models.UserInfo,UserInfoAdmin)            


             admin.site.register(models.UserGroup)            


             admin.site.register(models.Asset)




d、为数据表添加搜索功能

from              django.contrib              import              admin            


                          


             from              app01              import               models            


                          


             class              UserInfoAdmin(admin.ModelAdmin):            


                          list_display              =              (             'username'             ,              'password'             ,              'email'             )            


                          search_fields              =              (             'username'             ,              'email'             )            


                          


             admin.site.register(models.UserType)            


             admin.site.register(models.UserInfo,UserInfoAdmin)            


             admin.site.register(models.UserGroup)            


             admin.site.register(models.Asset)




e、添加快速过滤


from              django.contrib              import              admin            


                          


             from              app01              import               models            


                          


             class              UserInfoAdmin(admin.ModelAdmin):            


                          list_display              =              (             'username'             ,              'password'             ,              'email'             )            


                          search_fields              =              (             'username'             ,              'email'             )            


                          list_filter              =              (             'username'             ,              'email'             )            


                          


                          


                          


             admin.site.register(models.UserType)            


             admin.site.register(models.UserInfo,UserInfoAdmin)            


             admin.site.register(models.UserGroup)            


             admin.site.register(models.Asset)



更多:http://docs.30c.org/djangobook2/chapter06/


标签:Web,Python,py,40,django,models,url,import,admin
From: https://blog.51cto.com/u_12667998/7074848

相关文章

  • Python学了基本语法 下一步该学什么 ?
    刚入门Python,学习了基本语法后,你可以开始编写简单的程序了。接下来,你可以学习Python的标准库和第三方库,掌握更多的编程技巧和知识,提高自己的编程能力。同时,也可以通过实践项目来巩固所学知识,提高自己的实战能力。学习Python基本语法是入门的第一步,接下来你可以考虑以下几个方向:1......
  • python模块之sys
    sys模块提供许多函数和变量来处理Python运行时环境的不同部分处理命令行参数在解释器启动后,argv列表包含了传递给脚本的所有参数,列表的第一个元素为脚本自身的名称.处理模块path列表是一个由目录名构成的列表,Python从中查找扩展模块(Python源模块,编译模块,或者二进......
  • python'__init__.py'文件中'__all__'的作用
    以前我以为__all__的作用是限制导出哪些函数或者变量,后来发现只有在fromxximport*语句中才是这样,而importxxx是不起作用的,后者是可以使用模块中的所有全局变量和函数的.例如下面的__init__.py文件:__all__=['brysj2','__author__']brysj2=88a1=99__author__......
  • Web缓存—Squid代理服务
    一、Squid的相关知识1squid的概念  Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。代理服务器是一个位于客户端和原始(资源)服务器之间的服务器,为了......
  • python中的__main__.py文件
    在Python中,__main__.py文件在几个方面发挥作用:使目录可执行:当你有一个目录(或称为包)并希望能够像执行脚本那样运行它时,__main__.py文件会被调用。例如,如果你有一个名为mypackage的目录,它包含一个__main__.py文件,那么你可以通过以下方式运行它:python-mmypackage在上......
  • 【Python&RS】GDAL库Warp函数介绍
    ​        GDAL(GeospatialDataAbstractionLibrary)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。 Python的GDAL库作为栅格数据的处理转换库,其支持几百种栅格数......
  • python 学习-函数-匹配替换等操作
    1.re.match匹配re.match(pattern,string)`:从字符串的开头匹配正则表达式,返回一个匹配对象。如果没有找到匹配的子串,返回`None`str='choice:['app1-ui','app2-ui']'#查找str是否以空格开头第一个有效字符是choice的的行,如果是打印okifre.match(r'\s+choice.*',str):......
  • WebSocket
    在搭建聊天室时,选择使用TCP请求而不是HTTP请求是因为TCP(传输控制协议)和HTTP(超文本传输协议)具有不同的特性,适用于不同的场景。以下是选择TCP请求而不是HTTP请求的一些原因:即时性:TCP连接可以保持长时间,使得聊天室能够实时地传输消息,而不需要每次都建立新的连接,从而减少了延迟。......
  • JSON WEB TOKEN - 简单的token认证方式 - 告别session和cookie - Java Demo
    JWT简介jwt非常适合前后分离和分布式的应用不必在服务端存储session,本地也不用存储cookie直接存两段信息即可localStorage["jwt"]=jwt;//tokenlocalStorage["name"]=json.name;//token中加密的某个字段,用于后期请求带上校验token是否被改可以把认证......
  • 怎么解释web api 是无状态
    WebAPI被称为无状态,这主要是指它不会保存客户端的任何数据。每一个请求需要携带所有必要的信息,因为WebAPI不会记住前一次请求的信息。它的设计是完全无状态的,每一次请求都是一个全新的交互,不依赖于任何历史上的信息或状态。对应的,这种无状态的规范让WebAPI更易扩展和管理,同时也......