User:Ndhanir: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
 
(149 intermediate revisions by the same user not shown)
Line 1: Line 1:
=='''Web.py Introduction'''==
{{db-multiple|U5|G11}}
Web.py is a [https://en.wikipedia.org/wiki/Free_and_open_source free and open source] [https://en.wikipedia.org/wiki/Web_application_framework web application framework] that is as simple as it is powerful. Web.py was originally published while Aaron swartz worked at [http://reddit.com/ reddit.com], where the site used it ass it grew to become one of the top 1000 sites according to Alexa and served millions of daily page views. "It's the anti-framework framework. web.py doesn't get in your way." explained founder Steve Huffman.
{{Infobox software
| name                  =  
| logo                  = <!-- Image name is enough -->
| Author                = [https://en.wikipedia.org/wiki/Aaron_Swartz Aaron swartz]
| released              = <!-- {{May-2005 and age|YYYY|MM|DD|df=yes/no}} -->
| latest release version = web.py-0.37
| latest release date    = <!-- {{Start date and age|YYYY|MM|DD|df=yes/no}} -->
| size                  = {{nowrap|88 [[kilobyte|KB]]}}
| status                = Active
| programming language  = Python
| Type                  = Web application Framework
| website                = {{webpy.org}}
}}


The web.py slogan is: "Think about the ideal way to write a web app. Write the code to make it happen.". The goal of web.py is to build the ideal way to make web apps. In web.py, Instead of exposing Python objects, it allows you to build HTTP responses. Instead of trying to make the database look like an object, web.py makes the database easier to use. And instead of coming up with yet another way to write [https://en.wikipedia.org/wiki/HTML HTML], the web.py template system tries to bring Python into HTML.


Some of the sites which uses web.py are
Web.py is a [[free and open source]] [[Web application framework]] that is as simple as it is powerful.
 
The web.py slogan is: "Think about the ideal way to write a web app. Write the code to make it happen."<ref>{{Cite web|title = web.py official website|url = http://webpy.org/|website = web.py}}</ref>. The goal of web.py is to build the ideal way to make web apps. web.py allows the user to build [[HTTP]] responses instead of exposing [[Python]] objects. In web.py, [[database]] can be accessed easily as the framework makes database look like an [[object (computer science)|object]]. Also, the template system in web.py helps the user to bring Python into [[HTML]]<ref>{{Cite web|title = web.py philosophy|url = http://webpy.org/philosophy|website = web.py philosophy}}</ref>. "It's the anti-framework framework. web.py doesn't get in your way." explained founder Steve Huffman.
 
Some of the [[websites]] which uses web.py are
* [http://frinki.com/ Frinki], a new social network in spanish.
* [http://frinki.com/ Frinki], a new social network in spanish.
* [http://www.oyster.com/ oyster.com], a website that reviews hotels uses web.py for the entire website.
* [http://www.oyster.com/ oyster.com], a website that reviews hotels uses web.py for the entire website.
* [http://makehistory.national911memorial.org/ Make History], a project of the 9/11 memorial museum.
* [http://makehistory.national911memorial.org/ Make History], a project of the 9/11 memorial museum.


=='''Python'''==
=='''History'''==
* [[Grading]]
 
web.py was originally published while [[Aaron swartz]] worked at [http://reddit.com/ reddit.com], where the site used it as it grew to become one of the top 1000 sites according to [http://www.alexa.com/topsites/global;1 Alexa] and served millions of daily page views<ref>{{Cite web|title = Aaron swartz about web.py|url = http://www.aaronsw.com/weblog/rewritingreddit}}</ref>. The site was rewritten using other tools after being acquired by Condé Nast.


=='''Why Web.py'''==
=='''Why Web.py?'''<ref>{{Cite web|title = Python development story, Why web.py?|url = http://faruk.akgul.org/blog/python-development-story-why-webpy/|website = why web.py}}</ref>==


The reasons for using web.py are
The reasons for using web.py are
* Simplicity
* Simplicity
* Freedom
* Freedom
* writing clean code
* Writing clean code
* minimalism
* Minimalism
* a solid web framework
* A solid web framework


=='''Installation'''==
=='''Installation'''<ref>{{Cite web|title = web.py Installation|url = http://webpy.org/|website = Installation of web.py in linux}}</ref>==
To install web.py,  
To install web.py on Linux based operating system,  
* Firstly, download the following tar file:
* Firstly, download the following tar file:
  wget http://webpy.org/static/web.py-0.37.tar.gz
  wget http://webpy.org/static/web.py-0.37.tar.gz
* Extract the downloaded tar file
* Extract the downloaded tar file:
  tar -zxvf web.py-0.37.tar.gz
  tar -zxvf web.py-0.37.tar.gz
* tar -zxvf web.py-0.37.tar.gz
* Go to web.py-0.37 directory:
  cd web.py-0.37/
  cd web.py-0.37/
* Install and make it accessible to all the applications
* Install and make it accessible to all the applications:
  sudo python setup.py install
  sudo python setup.py install
=='''Web.py skeleton'''<ref>{{Cite web|title = web.py GitHub|url = https://github.com/webpy/webpy|website = web.py github}}</ref>==
Every web application needs a skeleton. A sample skeleton of web.py application looks as follows.
* doc: Documentation of all the files.
* licenses: All the licenses of the project and the libraries used in the application.
* requirements: Specifying the third party libraries.
* sh: bash script files of the project.
* [[www]]: The required web application itself.
** app: contains the application modules.
*** [http://stackoverflow.com/questions/1015813/what-goes-into-the-controller-in-mvc controllers]: This module contains the handler modules of controller package.
*** tools: Tools that are used for the project.
*** [http://betterexplained.com/articles/intermediate-rails-understanding-models-views-and-controllers/ views]]: Template files.
*** [http://betterexplained.com/articles/intermediate-rails-understanding-models-views-and-controllers/ models]: Database models of the application.
*** bridge: It is used to communicate with the server which is written in another language.
** lib: The library files developed for the project. These are different from the tools mentioned in the app. Libraries can be used in other projects where as tools are limited to the project itself.
** public: This folder contains the minimized compiled [[CSS]], [[Javascript]], [[CoffeeScript]] files and images so the files in this folder are production ready and can't be used in development.
** static: Contains the development CSS, CoffeeScript, Javascript, and images files of the project.
** test: These are the test files.
** tmp: Garbage files.
** main.py: These are the only files that are directly executed by the server.
** main_development.py: Main executable file in development mode.
** settings.py: Global constants and settings of the application.
** urls.py: Contains [[URL]]'s of the application


=='''Features of web.py'''==
=='''Features of web.py'''==


''web.py has two interesting features''
''web.py has two unique features''


===Databases===
===Databases<ref>{{Cite web|title = web.py Databases|url = http://webpy.org/cookbook/select|website = web.py Database db.select}}</ref>===


The database package lets you access various of different databases. Accessing different databases refers to connecting to multiple databases. However, its not an [https://en.wikipedia.org/wiki/Object-relational_mapping ORM]. This feature is missing in [https://en.wikipedia.org/wiki/Django_(web_framework) Django] (another web framework) from long time. This feature is helpful for the people who are good at SQl and don't like to use SQL as it is similar to sqlite3 package but doesn't use ORM.
The database package lets the user access various different databases. Accessing different databases refers to connecting multiple databases. However, its not an [[ORM]]. It is similar to sqlite3 package which doesn't use ORM. This feature is missing in [[Django]] (another web framework). web.py has flexible modules which allow the user to wipe it out completely and use with another web framework.
Before creating database object, the user must install appropriate database library like psycopg2 for [[PostgreSQL]], MySQLdb for [[MySQL]] and sqlite3 for [[SQLite]]. Working with more databases is not at all difficult with web.py which is explained by the following example:
<pre>
db1 = web.database(dbn='postgres', db='dbname1', user='username1', pw='password2')
db2 = web.database(dbn='postgres', db='dbname2', user='username2', pw='password2')
</pre>


===Forms===
===Forms<ref>{{Cite web|title = web.py Forms|url = http://webpy.org/cookbook/forms|website = Usage of forms in web.py}}</ref>===


A forms package is present in web.py which let's us create forms and validators. Ironically, it doesn't have built-in protection against [https://en.wikipedia.org/wiki/Cross-site_request_forgery CSRF]. If you want to create a login form, you could use forms package to create.
A forms package is present in web.py which let's the user create forms and [https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Forms/Data_form_validation validators]. The form module of web.py allows the ability to generate html forms, get user input, and validate it before processing it or adding it to a database. But it doesn't have built-in protection against [[CSRF]]. A sample login form is as follows:
<pre>
login = form.Form(
    form.Textbox('username'),
    form.Password('password'),
    form.Button('Login'),
)
</pre>


Another interesting feature about web.py is its flexibility. It has flexible modules which can be used with another framework.
Another interesting feature about web.py is its flexibility. It has flexible modules which can be used with another framework.


==Hello world example==
=='''Hello world example'''==
* [[Deploying to Production]]
<pre>
* [[Downloading Production Data]]
import web
* [[Accessing the Production Server]]
urls = (
'/', 'index'
)
 
class index:
def GET(self):
return "Hello, ECE517!"
 
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
</pre>
 
If the above example is considered, then the user start the application by importing the web.py module using the following command
import web
 
The most important part of the website is its URL structure. web.py makes it easy to make great URLs.
 
<pre>
urls = (
  '/', 'index'
)
</pre>
 
The first part is a [[regular expressions]] that matches a URL, like /, /help/faq, /item/, etc. The parentheses say to capture that piece of the matched data for use later on. The second part is the name of a class to send the request to, like index, view, welcome, hello (which gets the hello ECE517 of the welcome module), or get_\1. \1 is replaced by the first capture of the regular expression; any remaining captures get passed to function.<ref>{{Cite web|title = web.py Hello world example|url = http://webpy.org/docs/0.3/tutorial|website = Web.py example tutorial}}</ref>
 
At the top of each application, the user usually see the full URL dispatching scheme defined as a tuple.
<pre>
urls = (
    "/tasks/?", "signin",
    "/tasks/list", "listing",
    "/tasks/post", "post",
    "/tasks/act", "actions",
    "/tasks/signup", "signup"
)
</pre>
The format of this tuple is: url-path-pattern, handler-class this pattern will repeat as more url patterns are defined.
 
=='''Conclusion'''==
 
web.py is a minimalist framework whose aim is not to abstract away the details of interacting with the Web, but to make that interaction easier. It is designed in such a way that user will get started quickly with web.py and find writing [http://www.w3schools.com/tags/ref_httpmethods.asp HTTP GET] function handlers directly<ref>{{Cite web|title = comparison of frameworks|url = http://www.infoworld.com/article/2622836/application-development/pillars-of-python--six-python-web-frameworks-compared.html?page=2|website = Comparison of different python web frameworks}}</ref>. Likewise, the web.py database system does not abstract away [[SQL]] rather than hide the fact that the user is querying a database. It hides the details of working with different databases. The framework of web.py is light, photonic when compared to frameworks like [[flask (web_framework) | flask]].
 
=='''See Also'''==
[[Django]]
 
[[Bottle (web framework) | Bottle]]
 
=='''References'''==
 
 
 
 
 
 
 
 
 
 
=='''Wiki write up'''==
 
About Review mapping controller
 
/* When a reviewerreport reviews, assigning reviews and quizzes to teams. It also contains methods to assign reviews to participants automatically*/ Ignore this
 
Review mapping controller contains methods related to peer reviewing strategies. It contains methods to add a reviewer, delete a reviewer, selecting a reviewer. Depending on the number of students and number of submissions, the topics to be reviewed are assigned to the students automatically. If a user wants to look for the submission team , it returns the team by comparing the submission id's with the team id's. Also, it assigns quizzes dynamically. Generation of review report, feedback report and teammate review is done.
 
==='''Code Improvements'''===
 
1. Unused variables and arguments: There are unused variables in the methods. If there are unused variables in the methods, it uses stack unnecessarily. So, it is better to remove the unused variables.
 
When both keys and values are not used, but given as arguments, then the used variables can be added "_" or replaced with "_" to represent it as unused variable but allowed in the arguments.
 
<pre>
At line 533 and line 539
Previous Code: teams_hash = unsorted_teams_hash.sort_by{|k, v| v}.to_h
After Changing the code: teams_hash = unsorted_teams_hash.sort_by{|_, v| v}.to_h
</pre>
 
2. Use sample instead of shuffle
When sample is used, the elements are chosen by using random and unique indices in the array so that the elements doesn't repeat in the array. This cannot be guaranteed in shuffle.
 
<pre>
 
Previous Code:
assignment_team = assignment_teams.to_a.shuffle[0] rescue nil
 
topic = assignment.candidate_topics_to_review(reviewer).to_a.shuffle[0] rescue nil
 
After Changing the code:
 
assignment_team = assignment_teams.to_a.sample rescue nil
 
topic = assignment.candidate_topics_to_review(reviewer).to_a.sample rescue nil
</pre>
 
 
==='''Testing UI'''===


==Conclusion==
'''Peer review information:'''
* [[Using Cucumber with Expertiza]]
* Instructor Login:
* [[Rails Testing Overview]]
        Username: Instructor6
* [[Expertiza Continuous Integration]]
        Password: password
* Student login:
        Username: Student6384
        Password: password


==References==
'''Steps for testing UI:'''
* [[Object-Oriented Design and Programming]]
# Login as an instructor (Using Instructor6 will help you import the participants from other assignments).
# Navigate to "Manage->Assignments".
# Click on "New Public Assignment" for creating a new assignment.
# Create a new assignment by providing assignment name, selecting a course, submission directory (Give any name) and description URL.
# Select "has teams?" and provide the team size. Click on create to create a new assignment.
## After that, click on review strategy and limit the number of reviews per submission.
## Click on "Due dates" and update date for submission and review. Adjust the review date and time in order to test the reviews.
## Click on "save". A new assignment is created and it can be viewed in "Manage->Assignments" section.
# In order to add participants, there are two methods to add students to the assignment.
## Click on "add participants" against the assignment. Enter the user login to add the student. Add atleast 6 participants so that the review mapping can be seen.
## Click on any previous assignment "add participants" and export the students list (I used wiki assignment).
## Click on your assignment "add participants" and import the students using the export file.
# Go back to "Assignments" section and click against "create teams".
## After clicking on "create teams", Click on "create teams" in the directed page.
### Teams can be formed either manually or automatically.
# Login as a student to submit the links for assignment (Valid hyperlink must be provided in the submission link). Add submission for atleast 5 students in order to check the automatic review mapping. (Password for student is password)
# After submitting the links for some students, Log in as an instructor to change the assignment phase to review phase.
## To change the review phase period, Go to assignments section and click on edit. Click on due dates and change the review due date.
# Now, login as a student and go to others work. Click on "Request a submission to review" and check whether a review is assigned automatically. If no assignments are submitted, then this cannot be tested.
# For teammate review report, author feedback report and review report, click against "review report" and all the review reports can be seen by selecting it in the drop down menu.

Latest revision as of 05:42, 1 April 2016

Template:Db-multiple Template:Infobox software


Web.py is a free and open source Web application framework that is as simple as it is powerful.

The web.py slogan is: "Think about the ideal way to write a web app. Write the code to make it happen."<ref></ref>. The goal of web.py is to build the ideal way to make web apps. web.py allows the user to build HTTP responses instead of exposing Python objects. In web.py, database can be accessed easily as the framework makes database look like an object. Also, the template system in web.py helps the user to bring Python into HTML<ref></ref>. "It's the anti-framework framework. web.py doesn't get in your way." explained founder Steve Huffman.

Some of the websites which uses web.py are

  • Frinki, a new social network in spanish.
  • oyster.com, a website that reviews hotels uses web.py for the entire website.
  • Make History, a project of the 9/11 memorial museum.

History

web.py was originally published while Aaron swartz worked at reddit.com, where the site used it as it grew to become one of the top 1000 sites according to Alexa and served millions of daily page views<ref></ref>. The site was rewritten using other tools after being acquired by Condé Nast.

Why Web.py?<ref></ref>

The reasons for using web.py are

  • Simplicity
  • Freedom
  • Writing clean code
  • Minimalism
  • A solid web framework

Installation<ref></ref>

To install web.py on Linux based operating system,

  • Firstly, download the following tar file:
wget http://webpy.org/static/web.py-0.37.tar.gz
  • Extract the downloaded tar file:
tar -zxvf web.py-0.37.tar.gz
  • Go to web.py-0.37 directory:
cd web.py-0.37/
  • Install and make it accessible to all the applications:
sudo python setup.py install

Web.py skeleton<ref></ref>

Every web application needs a skeleton. A sample skeleton of web.py application looks as follows.

  • doc: Documentation of all the files.
  • licenses: All the licenses of the project and the libraries used in the application.
  • requirements: Specifying the third party libraries.
  • sh: bash script files of the project.
  • www: The required web application itself.
    • app: contains the application modules.
      • controllers: This module contains the handler modules of controller package.
      • tools: Tools that are used for the project.
      • views]: Template files.
      • models: Database models of the application.
      • bridge: It is used to communicate with the server which is written in another language.
    • lib: The library files developed for the project. These are different from the tools mentioned in the app. Libraries can be used in other projects where as tools are limited to the project itself.
    • public: This folder contains the minimized compiled CSS, Javascript, CoffeeScript files and images so the files in this folder are production ready and can't be used in development.
    • static: Contains the development CSS, CoffeeScript, Javascript, and images files of the project.
    • test: These are the test files.
    • tmp: Garbage files.
    • main.py: These are the only files that are directly executed by the server.
    • main_development.py: Main executable file in development mode.
    • settings.py: Global constants and settings of the application.
    • urls.py: Contains URL's of the application

Features of web.py

web.py has two unique features

Databases<ref></ref>

The database package lets the user access various different databases. Accessing different databases refers to connecting multiple databases. However, its not an ORM. It is similar to sqlite3 package which doesn't use ORM. This feature is missing in Django (another web framework). web.py has flexible modules which allow the user to wipe it out completely and use with another web framework. Before creating database object, the user must install appropriate database library like psycopg2 for PostgreSQL, MySQLdb for MySQL and sqlite3 for SQLite. Working with more databases is not at all difficult with web.py which is explained by the following example:

db1 = web.database(dbn='postgres', db='dbname1', user='username1', pw='password2')
db2 = web.database(dbn='postgres', db='dbname2', user='username2', pw='password2')

Forms<ref></ref>

A forms package is present in web.py which let's the user create forms and validators. The form module of web.py allows the ability to generate html forms, get user input, and validate it before processing it or adding it to a database. But it doesn't have built-in protection against CSRF. A sample login form is as follows:

login = form.Form(
    form.Textbox('username'),
    form.Password('password'),
    form.Button('Login'),
)

Another interesting feature about web.py is its flexibility. It has flexible modules which can be used with another framework.

Hello world example

import web
urls = (
	'/', 'index'
	)

class index:
	def GET(self):
		return "Hello, ECE517!"

if __name__ == "__main__":
	app = web.application(urls, globals())
	app.run()

If the above example is considered, then the user start the application by importing the web.py module using the following command

import web

The most important part of the website is its URL structure. web.py makes it easy to make great URLs.

urls = (
  '/', 'index'
)

The first part is a regular expressions that matches a URL, like /, /help/faq, /item/, etc. The parentheses say to capture that piece of the matched data for use later on. The second part is the name of a class to send the request to, like index, view, welcome, hello (which gets the hello ECE517 of the welcome module), or get_\1. \1 is replaced by the first capture of the regular expression; any remaining captures get passed to function.<ref></ref>

At the top of each application, the user usually see the full URL dispatching scheme defined as a tuple.

urls = (
    "/tasks/?", "signin",
    "/tasks/list", "listing",
    "/tasks/post", "post",
    "/tasks/act", "actions",
    "/tasks/signup", "signup"
)

The format of this tuple is: url-path-pattern, handler-class this pattern will repeat as more url patterns are defined.

Conclusion

web.py is a minimalist framework whose aim is not to abstract away the details of interacting with the Web, but to make that interaction easier. It is designed in such a way that user will get started quickly with web.py and find writing HTTP GET function handlers directly<ref></ref>. Likewise, the web.py database system does not abstract away SQL rather than hide the fact that the user is querying a database. It hides the details of working with different databases. The framework of web.py is light, photonic when compared to frameworks like flask.

See Also

Django

Bottle

References

Wiki write up

About Review mapping controller

/* When a reviewerreport reviews, assigning reviews and quizzes to teams. It also contains methods to assign reviews to participants automatically*/ Ignore this

Review mapping controller contains methods related to peer reviewing strategies. It contains methods to add a reviewer, delete a reviewer, selecting a reviewer. Depending on the number of students and number of submissions, the topics to be reviewed are assigned to the students automatically. If a user wants to look for the submission team , it returns the team by comparing the submission id's with the team id's. Also, it assigns quizzes dynamically. Generation of review report, feedback report and teammate review is done.

Code Improvements

1. Unused variables and arguments: There are unused variables in the methods. If there are unused variables in the methods, it uses stack unnecessarily. So, it is better to remove the unused variables.

When both keys and values are not used, but given as arguments, then the used variables can be added "_" or replaced with "_" to represent it as unused variable but allowed in the arguments.

At line 533 and line 539
Previous Code: teams_hash = unsorted_teams_hash.sort_by{|k, v| v}.to_h
After Changing the code: teams_hash = unsorted_teams_hash.sort_by{|_, v| v}.to_h

2. Use sample instead of shuffle When sample is used, the elements are chosen by using random and unique indices in the array so that the elements doesn't repeat in the array. This cannot be guaranteed in shuffle.


Previous Code:
assignment_team = assignment_teams.to_a.shuffle[0] rescue nil

topic = assignment.candidate_topics_to_review(reviewer).to_a.shuffle[0] rescue nil

After Changing the code:

assignment_team = assignment_teams.to_a.sample rescue nil

topic = assignment.candidate_topics_to_review(reviewer).to_a.sample rescue nil


Testing UI

Peer review information:

  • Instructor Login:
       Username: Instructor6
       Password: password
  • Student login:
       Username: Student6384
       Password: password

Steps for testing UI:

  1. Login as an instructor (Using Instructor6 will help you import the participants from other assignments).
  2. Navigate to "Manage->Assignments".
  3. Click on "New Public Assignment" for creating a new assignment.
  4. Create a new assignment by providing assignment name, selecting a course, submission directory (Give any name) and description URL.
  5. Select "has teams?" and provide the team size. Click on create to create a new assignment.
    1. After that, click on review strategy and limit the number of reviews per submission.
    2. Click on "Due dates" and update date for submission and review. Adjust the review date and time in order to test the reviews.
    3. Click on "save". A new assignment is created and it can be viewed in "Manage->Assignments" section.
  6. In order to add participants, there are two methods to add students to the assignment.
    1. Click on "add participants" against the assignment. Enter the user login to add the student. Add atleast 6 participants so that the review mapping can be seen.
    2. Click on any previous assignment "add participants" and export the students list (I used wiki assignment).
    3. Click on your assignment "add participants" and import the students using the export file.
  7. Go back to "Assignments" section and click against "create teams".
    1. After clicking on "create teams", Click on "create teams" in the directed page.
      1. Teams can be formed either manually or automatically.
  8. Login as a student to submit the links for assignment (Valid hyperlink must be provided in the submission link). Add submission for atleast 5 students in order to check the automatic review mapping. (Password for student is password)
  9. After submitting the links for some students, Log in as an instructor to change the assignment phase to review phase.
    1. To change the review phase period, Go to assignments section and click on edit. Click on due dates and change the review due date.
  10. Now, login as a student and go to others work. Click on "Request a submission to review" and check whether a review is assigned automatically. If no assignments are submitted, then this cannot be tested.
  11. For teammate review report, author feedback report and review report, click against "review report" and all the review reports can be seen by selecting it in the drop down menu.